使用不同 WHERE 子句获取聚合的子查询
Posted
技术标签:
【中文标题】使用不同 WHERE 子句获取聚合的子查询【英文标题】:Subquery to get aggregate with different WHERE clause 【发布时间】:2014-11-28 11:18:56 【问题描述】:我正在做这个查询,我从 Adwords 报告中获取一些我保留的数据:
SELECT "client_name", "customer_id",
sum(clicks) as clicks,
sum(impressions) as impressions,
sum(cost) as cost,
avg(avg_cpc) as avg_cpc,
avg(conv_rate) as conv_rate,
sum(total_conv_value) as total_conv_value,
sum(converted_clicks) as converted_clicks,
sum(conversions) as conversions,
avg(search_impr_share) as search_impr_share,
avg(cost_converted_click) as cost_converted_click,
avg(average_position) as average_position
FROM "adwords_daily_account_performance"
WHERE "day" >= ?
GROUP BY "customer_id", "client_name"
该表还有一个名为network
的列。此列可以是“展示广告网络”或“搜索网络”。此查询聚合了来自两个网络的所有内容,但我想在聚合查询中添加另一列,名为 Ctr
。
我如何获得 Ctr
列,它只在同一查询中聚合 network = 'Search Network' 的数据?
【问题讨论】:
【参考方案1】:如果网络匹配,则使用 case 语句选择数字,否则为 0:
SELECT sum( CASE WHEN network = 'Search Network' THEN Ctr ELSE 0 END )
【讨论】:
谢谢!它最初不起作用。我认为当我写以下内容时缺少 WHEN 子句:avg(CASE WHEN network=\'Search Network\' THEN Ctr ELSE 0 END ) as Ctr
它有效,但我有一个问题。似乎平均值是错误的,因为每次它不是正确的网络时都会加 0。
哦...我不确定如何使用 AVG 执行此操作。您可以尝试执行“ELSE NULL”,它可能会在计算平均值时跳过那些。但它也可以将它们解释为 0,在这种情况下,它可能无法在单个查询中完成。
@dadord 。 . .只需删除 else
子句。然后case
将返回NULL
,大多数聚合函数都会忽略它。 (NULL
不被视为0
。)【参考方案2】:
在 Postgres 9.4+ 中,您可以使用 aggregate FILTER
:
sum(Ctr) FILTER (WHERE network = 'Search Network') AS sum_ctr
详情:
How can I simplify this game statistics query?【讨论】:
以上是关于使用不同 WHERE 子句获取聚合的子查询的主要内容,如果未能解决你的问题,请参考以下文章