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