Postgresql

按分組數據應用限制和條件

  • August 4, 2015

我正在建構一個 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().

引用自:https://dba.stackexchange.com/questions/108999