目前我有這個,通過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'是規劃師的優化圍欄。可能或不會有所作爲。 –