我有一个数据汇总表,看起来像这样:
create table event_summary (
created_at timestamp,
ad_id integer,
views integer,
unique_views integer,
clicks integer,
unique_clicks integer,
price integer
);
create index on event_summary using BRIN (created_at);
我试图只在SQL中表达自己,但很难理解如何在组内聚合集合。我有以下查询:
select
sum(views),
sum(unique_views),
sum(clicks),
sum(unique_clicks),
price
from event_summary
group by ad_id, price
order by views desc
查询工作得很好。然后,在我的应用程序代码中,我可以计算每个ad_id
的每英里成本,因为price
已经分离。所以我把views
的值乘以price
。然后我把所有的值加起来,我就得到了每个ad_id
的最终每英里成本。
但我对分组集合,甚至是汇总感到好奇。在SQL上进行这种计算是可能的,甚至是推荐的吗?
1条答案
按热度按时间z2acfund1#
听起来你实际上可以用一个window function和一个子查询来解决问题:demo
| ad_id| views_sum| unique_views_sum| clicks_sum| unique_clicks_sum|价格|每英里费用|
| --|--|--|--|--|--|--|
| 1 | 115109 | 36892 | 12166 | 8555 | 1760 | 364890640 |
| 1 | 90166 | 37656 | 13606 | 8683 | 1800 | 364890640 |
| 2 | 112170 | 36716 | 13889 | 6330 | 1760 | 409178400 |
| 2 | 117644 | 40753 | 11531 | 6793 | 1800 | 409178400 |
| 3 | 103802 | 35926 | 13843 | 7130 | 1800 | 381687920 |
| 3 | 110707 | 43738 | 12581 | 6989 | 1760 | 381687920 |
如果按
price
分组的唯一原因是计算数据库外的数据,那么可以摆脱它,然后继续使用聚合函数中的算术:demo| ad_id| views_sum| unique_views_sum| clicks_sum| unique_clicks_sum|每英里费用|
| --|--|--|--|--|--|
| 1 | 205275 | 74548 | 25772 | 17238 | 364890640 |
| 2 | 229814 | 77469 | 25420 | 13123 | 409178400 |
| 3 | 214509 | 79664 | 26424 | 14119 | 381687920 |
这是讨论完整聚合函数调用语法的文档-注意它说的是 expression 而不是 column,这意味着有相当多的灵活性,包括上面的算术。在页面的顶部,你可以看到15种其他类型的表达式,其中的列表并不详尽。