Postgresql
按分組數據應用限制和條件
我正在建構一個 api 端點來發送統計數據,然後將其繪製在圖表上。最困難的部分是我需要執行的查詢。總而言之,我想要
n
一個時期內每天銷量第一的產品。例如,時間段可以是任何日期範圍。假設我有一個
sales
包含以下數據的表(這不是我定義的真實模式):--------------------------------- date | product_name | count --------------------------------- 2015-01-08 | A | 10 2015-01-08 | B | 5 2015-01-08 | C | 1 2015-02-08 | A | 5 2015-02-08 | B | 3 2015-02-08 | C | 100
假設我想要每天最暢銷的 2 種產品。我想要一個返回以下內容的查詢:
--------------------------------- date | product_name | count --------------------------------- 2015-01-08 | A | 10 2015-01-08 | B | 5 2015-02-08 | C | 100 2015-02-08 | A | 5
請注意,除此之外,它
C
是整個期間銷量最高的產品,它並沒有出現在前 2 名中2015-01-08
有沒有辦法實現我想要的?
謝謝 :)
解決此類問題的一種方法是使用視窗函式:
WITH cte AS ( SELECT date, product_name, count, ROW_NUMBER() OVER (PARTITION BY date ORDER BY count DESC) AS rn FROM sales WHERE date >= '2015-07-01' -- example range AND date < '2015-08-01' -- 2015, July ) SELECT date, product_name, count FROM cte WHERE rn <= 2 -- max of 2 products per date ORDER BY -- this does not affect the result date, count DESC ; -- only its order
如果有平局,將任意解決,每個日期僅返回 2 行。如果您想解決具有特定偏好的關係,您可以更改
OVER
子句內的順序。假設您希望產品名稱與最高銷售額相關時按字母順序排序,請使用(... ORDER BY count DESC, product_name)
.如果您想要每個日期的所有(捆綁)產品,只需更改
ROW_NUMBER()
為RANK()
.