目前我有这个,通过PostgreSQL的获得每日,每周,和在一个查询事件的发生的月平均
- 功能会采取汇总每日,每周,每月数到中间表相当大的查询按事件名称和日期分组的事件的
count()
。 - 通过按事件做
avg()
组,选择每个中间表的平均计数,对结果进行联合,并且因为我想每天,每周,每月都有一个单独的列,将填充值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;
只是一个真正的快速问题,没有检查任何事实...不是比工会更昂贵的加入?除了偏好之外,还有什么理由不使用'with'? – m0meni
在这种情况下,'union'和'join'之间的区别应该是不可察觉的。类似的评论可能涉及使用'cte'。当我需要递归时,通常使用'with'。 – klin
'CTE'是规划师的优化围栏。可能或不会有所作为。 –