【发布时间】:2016-11-08 16:03:47
【问题描述】:
目前我有这个相当大的查询,由
- 通过获取按事件名称和日期分组的事件的
count(),将每日、每周、每月计数汇总到中间表中。 - 通过
avg()group by just event 选择每个中间表的平均计数,合并结果,因为我希望每天、每周、每月有一个单独的列,将填充值设置为 0到空列中。 - 然后我对所有列求和,0 基本上充当无操作,这为每个事件提供了一个值。
虽然查询很大,但我觉得我在做很多重复的工作。有什么方法可以更好地执行此查询或使其更小吗?我以前没有真正做过这样的查询,所以我不太确定。
WITH monthly_counts as (
SELECT
event,
count(*) as count
FROM tracking_stuff
WHERE
event = 'thing'
OR event = 'thing2'
OR event = 'thing3'
GROUP BY event, date_trunc('month', created_at)
),
weekly_counts as (
SELECT
event,
count(*) as count
FROM tracking_stuff
WHERE
event = 'thing'
OR event = 'thing2'
OR event = 'thing3'
GROUP BY event, date_trunc('week', created_at)
),
daily_counts as (
SELECT
event,
count(*) as count
FROM tracking_stuff
WHERE
event = 'thing'
OR event = 'thing2'
OR event = 'thing3'
GROUP BY event, date_trunc('day', created_at)
),
query as (
SELECT
event,
0 as daily_avg,
0 as weekly_avg,
avg(count) as monthly_avg
FROM monthly_counts
GROUP BY event
UNION
SELECT
event,
0 as daily_avg,
avg(count) as weekly_avg,
0 as monthly_avg
FROM weekly_counts
GROUP BY event
UNION
SELECT
event,
avg(count) as daily_avg,
0 as weekly_avg,
0 as monthly_avg
FROM daily_counts
GROUP BY event
)
SELECT
event,
sum(daily_avg) as daily_avg,
sum(weekly_avg) as weekly_avg,
sum(monthly_avg) as monthly_avg
FROM query
GROUP BY event;
【问题讨论】:
标签: sql postgresql query-optimization aggregate analytics