Postgresql 循环通过一个查询为另一个查询创建结果
Postgresql loop through onequery to create results for another query
我正在使用 Postgresql 9.6,想知道这是否可行。
我有一个类似的查询:
with mkt_types as (
select distinct(mkt_medium)
from sessions
), sessions_all as (
select *
from sessions
)
select
count(visitor_id) as total_visits,
count(1) FILTER (where mkt_medium = 'seo') as seo_visitors,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1) as seo_new_visitors,
count(1) FILTER (where mkt_medium = 'seo' and conversion_visit = 'true') as seo_converters,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1 and conversion_visit = 'true') as seo_new_converters
from sessions_all;
是否可以从 mkt_types 获取值并遍历结果并替换查询的 'seo' 部分。
示例
如果我有 mkt_types 'seo'、'email'、'banner' 那么我的最终查询将以我输入的结果结束:
with mkt_types as (
select distinct(mkt_medium)
from sessions
), sessions_all as (
select *
from sessions
)
select
count(visitor_id) as total_visits,
count(1) FILTER (where mkt_medium = 'seo') as seo_visitors,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1) as seo_new_visitors,
count(1) FILTER (where mkt_medium = 'seo' and conversion_visit = 'true') as seo_converters,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1 and conversion_visit = 'true') as seo_new_converters,
count(1) FILTER (where mkt_medium = 'email') as email_visitors,
count(1) FILTER (where mkt_medium = 'email' and domain_sessionidx = 1) as email_new_visitors,
count(1) FILTER (where mkt_medium = 'email' and conversion_visit = 'true') as email_converters,
count(1) FILTER (where mkt_medium = 'email' and domain_sessionidx = 1 and conversion_visit = 'true') as email_new_converters,
count(1) FILTER (where mkt_medium = 'banner') as banner_visitors,
count(1) FILTER (where mkt_medium = 'banner' and domain_sessionidx = 1) as banner_new_visitors,
count(1) FILTER (where mkt_medium = 'banner' and conversion_visit = 'true') as banner_converters,
count(1) FILTER (where mkt_medium = 'banner' and domain_sessionidx = 1 and conversion_visit = 'true') as banner_new_converters
from sessions_all;
谢谢
在我看来,我们似乎不能那样做。当然,您可以放入函数并构建查询。
如果您可以垂直而不是水平获得结果,我可以建议另一个这样的查询:
(
select 'all' as mkt_medium,
count(1) as total_visits,
count(1) FILTER (where domain_sessionidx = 1) as new_visitors,
count(1) FILTER (where conversion_visit = 'true') as converters,
count(1) FILTER (where domain_sessionidx = 1 and conversion_visit = 'true') as new_converters
FROM sessions_all
) UNION ALL (
SELECT mkt_medium,
count(1) as total_visits,
count(1) FILTER (where domain_sessionidx = 1) as new_visitors,
count(1) FILTER (where conversion_visit = 'true') as converters,
count(1) FILTER (where domain_sessionidx = 1 and conversion_visit = 'true') as new_converters
from sessions_all
GROUP BY mkt_medium
)
我正在使用 Postgresql 9.6,想知道这是否可行。
我有一个类似的查询:
with mkt_types as (
select distinct(mkt_medium)
from sessions
), sessions_all as (
select *
from sessions
)
select
count(visitor_id) as total_visits,
count(1) FILTER (where mkt_medium = 'seo') as seo_visitors,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1) as seo_new_visitors,
count(1) FILTER (where mkt_medium = 'seo' and conversion_visit = 'true') as seo_converters,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1 and conversion_visit = 'true') as seo_new_converters
from sessions_all;
是否可以从 mkt_types 获取值并遍历结果并替换查询的 'seo' 部分。
示例 如果我有 mkt_types 'seo'、'email'、'banner' 那么我的最终查询将以我输入的结果结束:
with mkt_types as (
select distinct(mkt_medium)
from sessions
), sessions_all as (
select *
from sessions
)
select
count(visitor_id) as total_visits,
count(1) FILTER (where mkt_medium = 'seo') as seo_visitors,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1) as seo_new_visitors,
count(1) FILTER (where mkt_medium = 'seo' and conversion_visit = 'true') as seo_converters,
count(1) FILTER (where mkt_medium = 'seo' and domain_sessionidx = 1 and conversion_visit = 'true') as seo_new_converters,
count(1) FILTER (where mkt_medium = 'email') as email_visitors,
count(1) FILTER (where mkt_medium = 'email' and domain_sessionidx = 1) as email_new_visitors,
count(1) FILTER (where mkt_medium = 'email' and conversion_visit = 'true') as email_converters,
count(1) FILTER (where mkt_medium = 'email' and domain_sessionidx = 1 and conversion_visit = 'true') as email_new_converters,
count(1) FILTER (where mkt_medium = 'banner') as banner_visitors,
count(1) FILTER (where mkt_medium = 'banner' and domain_sessionidx = 1) as banner_new_visitors,
count(1) FILTER (where mkt_medium = 'banner' and conversion_visit = 'true') as banner_converters,
count(1) FILTER (where mkt_medium = 'banner' and domain_sessionidx = 1 and conversion_visit = 'true') as banner_new_converters
from sessions_all;
谢谢
在我看来,我们似乎不能那样做。当然,您可以放入函数并构建查询。
如果您可以垂直而不是水平获得结果,我可以建议另一个这样的查询:
(
select 'all' as mkt_medium,
count(1) as total_visits,
count(1) FILTER (where domain_sessionidx = 1) as new_visitors,
count(1) FILTER (where conversion_visit = 'true') as converters,
count(1) FILTER (where domain_sessionidx = 1 and conversion_visit = 'true') as new_converters
FROM sessions_all
) UNION ALL (
SELECT mkt_medium,
count(1) as total_visits,
count(1) FILTER (where domain_sessionidx = 1) as new_visitors,
count(1) FILTER (where conversion_visit = 'true') as converters,
count(1) FILTER (where domain_sessionidx = 1 and conversion_visit = 'true') as new_converters
from sessions_all
GROUP BY mkt_medium
)