簡體   English   中英

選擇組中每個組的最大記錄

[英]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;

筆記

暫無
暫無

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

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