繁体   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