基本上我有以下來自查詢的資料集,'rn' 是一個磁區,用于為下一個要求添加行號:
WITH dataset AS (...)
-- gives
business_id | amount | year | month | row_num
--------------------------------------------
1000 2000 2021 9 1
1000 1000 2021 9 2
1000 1500 2021 8 3
1000 1000 2020 9 4
1000 1000 2020 8 5
1043 4000 2021 8 1
1043 4500 2021 7 2
1043 4000 2021 6 3
1043 4100 2021 5 4
1043 4200 2021 4 5
1043 5000 2020 12 6
1043 5500 2020 11 7
1043 5600 2020 10 8
1043 5100 2020 9 9
1043 5300 2020 8 10
1043 5100 2020 7 11
1043 5000 2020 6 12
1139 4000 2021 9 1
1139 3000 2021 8 2
1139 2000 2021 7 3
1139 1000 2020 6 4
我的第一個要求是獲取每個業務的最新年/月值,我可以通過選擇來完成rn = 1,如下所示:
WITH dataset AS (...)
SELECT * FROM dataset WHERE row_num = 1
-- gives
business_id | amount | year | month | row_num
-----------------------------------------------
1000 2000 2021 9 1
1043 4000 2021 8 1
1139 4000 2021 9 1
到目前為止一切順利,第二個要求,我不知道該怎么做,是從去年獲得相同的記錄來比較當前年份,所以我需要這個資料集:
business_id | amount | year | month | row_num
-----------------------------------------------
1000 2000 2021 9 1
1000 1000 2020 9 4
1043 4000 2021 8 1
1043 5300 2020 8 10
1139 4000 2021 9 1
任何想法如何做到這一點?請注意,最后一條記錄沒有 2020 年的值,這也是一種情況。
uj5u.com熱心網友回復:
WITH dataset AS (...)
, base AS (SELECT * FROM dataset WHERE row_num = 1)
TABLE base
UNION ALL
SELECT d.*
FROM base b
JOIN dataset d ON d.business_id = b.business_id
AND d.year = b.year - 1
AND d.month = b.month
我添加了另一個 CTE,并在外部參考它兩次SELECT,使用UNION ALL. 你可以添加任何ORDER BY你想要的,也許......
ORDER BY business_id, row_num
UNION ALL 僅添加去年的相關行(如果存在)。
很有可能,可以優化查詢。獲得第一排row_number()通常不是性能之王。看:
- 選擇每個 GROUP BY 組中的第一行?
關于TABLE速記:
- SELECT * FROM 有快捷方式嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327546.html
標籤:sql PostgreSQL 每组最大 n 公用表表达式
下一篇:嵌套或多個case函式
