簡體   English   中英

需要幫助在Postgres中用窗口函數替換子查詢

[英]Need help replacing subqueries with window functions in Postgres

我有一個查詢,該查詢返回所需的結果,但是由於子查詢,它需要進行3次全表掃描。 我將其轉換為窗口功能的嘗試無效。 思考?

SELECT a_day
    ,max(week_count)
    ,max(month_count)
FROM (
    SELECT DISTINCT date_trunc('day', created_at) AS a_day
        ,(
            SELECT count(*)
            FROM accounts AS wk
            WHERE wk.created_at BETWEEN (a.created_at - INTERVAL '7 days')
                    AND a.created_at
            ) AS week_count
        ,(
            SELECT count(*)
            FROM accounts AS wk
            WHERE wk.created_at BETWEEN (a.created_at - INTERVAL '30 days')
                    AND a.created_at
            ) AS month_count
    FROM accounts a
    ORDER BY a_day
    ) AS sub_1
GROUP BY a_day
ORDER BY a_day
with sub_1 as
(select date_trunc('day', created_at) AS a_day, count(*) as week_count
 from accounts
 where created_at BETWEEN (created_at - INTERVAL '7 days') and created_at
 group by date_trunc('day', created_at))
,sub_2 as 
(select date_trunc('day', created_at) AS a_day, count(*) as month_count
 from accounts
 where created_at BETWEEN (created_at - INTERVAL '30 days') and created_at
 group by date_trunc('day', created_at))
 select sub_1.a_day, max(sub_1.week_count), max(sub_2.month_count)
 from sub_1 join sub_2 on sub_1.a_day = sub_2.a_day
 group by sub_1.a_day

嘗試使用Common表表達式,看看是否可以獲得性能提升。 這將掃描表2次而不是3次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM