[英]Select max record of each group on a group by
我正在使用PostgreSQL。 我需要選擇每個組的最大值 ,這種情況是表格代表每天銷售的產品,我想知道每天銷售最多的產品。
SELECT sum(detalle_orden.cantidad) as suma,detalle_orden.producto_id as producto
,to_char(date_trunc('day',orden.fecha AT TIME ZONE 'MST'),'DY') as dia
FROM detalle_orden
LEFT JOIN orden ON orden.id = detalle_orden.order_id
GROUP BY orden.fecha,detalle_orden.producto_id
ORDER BY dia,suma desc
正在返回:
suma producto dia
4 1 FRI
1 2 FRI
5 3 TUE
2 2 TUE
我想得到:
suma producto dia
4 1 FRI
5 3 TUE
僅每天的頂級產品(每組的max(suma)
)。
我嘗試了不同的方法,例如子查詢,但是使用的聚合函數使事情變得有些困難。
您可以(ab)將SELECT DISTINCT ON
與適當的排序子句一起使用。 假設您將上一個查詢放入視圖:
SELECT DISTINCT ON (dia, producto) * FROM some_view ORDER BY dia, producto, suma DESC;
DISTINCT
確保您每天和每個產品只保留一行,而ORDER BY
確保它保留正確的一行
通過窗口功能: RANK,您可以輕松獲得它:
select * from
(
select suma,producto,dia, rank() over (partition by dia order by suma desc) as ranking
from your_query
)A
where ranking = 1
因此,您的最終查詢將類似於:
select * from
(
select suma,producto,dia, rank() over (partition by dia order by suma desc) as ranking
from
(
SELECT sum(detalle_orden.cantidad) as suma,detalle_orden.producto_id as producto,to_char(date_trunc
('day',orden.fecha AT TIME ZONE 'MST'),'DY') as dia FROM detalle_orden LEFT JOIN
orden ON orden.id= detalle_orden.order_id GROUP by
orden.fecha,detalle_orden.producto_id ) B
) A
where ranking = 1
您仍然可以使用DISTINCT ON
在單個查詢級別上完成此操作而無需子查詢,因為DISTINCT
是在GROUP BY
和聚合函數(以及窗口函數之后)之后應用的:
SELECT DISTINCT ON (3)
sum(d.cantidad) AS suma
, d.producto_id AS producto
, to_char(o.fecha AT TIME ZONE 'MST', 'DY') AS dia
FROM detalle_orden d
LEFT JOIN orden o ON o.id = d.order_id
GROUP BY o.fecha, d.producto_id
ORDER BY 3, 1 DESC NULLS LAST, d.producto_id;
該解決方案每個dia
正好返回一行(如果有)。 如果多個產品並列銷量最高,那么我的任意選擇(但確定性和可復制性)是producto_id
較小的選擇。
如果您需要所有同伴都捆綁一天,請使用@Houari建議的rank()
。
在此相關答案中說明了SQL SELECT
查詢中的事件順序:
date_trunc()
在dia
的計算中只是噪音。 我刪除了
我將NULLS LAST
添加到降序排序順序,因為目前尚不清楚結果中的suma
是否可能存在帶有NULL的行:
為了方便起見, DISTINCT ON
和GROUP BY
中的數字只是語法上的簡寫。 類似:
以及添加的表別名(語法簡寫)。
DISTINCT ON
基礎
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.