如何使用GROUP BY查询商品首次订单的总Quantity?
解决方案
要实现获取每个商品首次订单的总Quantity,核心是先筛选出每个商品的首单记录,再对这些记录的Quantity求和。以下提供两种常用的实现方式:
方法一:子查询关联筛选
先通过子查询得到每个商品的首个订单号,再关联原表仅保留该订单的记录,最后分组求和:
SELECT o.Item, o.Order#, SUM(o.Quantity) AS Quantity FROM orders o INNER JOIN ( -- 子查询获取每个商品的首个订单号 SELECT Item, MIN(Order#) AS FirstOrder FROM orders GROUP BY Item ) f ON o.Item = f.Item AND o.Order# = f.FirstOrder GROUP BY o.Item, o.Order#
方法二:窗口函数标记首单
使用ROW_NUMBER()窗口函数为每个商品的订单按订单号排序,标记出首单的记录,再过滤后求和:
WITH ranked_orders AS ( SELECT Item, Order#, Quantity, -- 按商品分组,订单号升序排序,首单标记为1 ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Order#) AS rn FROM orders ) SELECT Item, Order#, SUM(Quantity) AS Quantity FROM ranked_orders WHERE rn = 1 -- 仅保留首单记录 GROUP BY Item, Order#
原查询问题说明
你之前的查询中,GROUP BY Item会将该商品的所有订单记录聚合在一起,MIN(Order#)能正确取到首单,但SUM(Quantity)会计算该商品所有订单的数量总和,而非仅首单的数量,因此需要先筛选出首单的记录再求和。
内容的提问来源于stack exchange,提问作者mf1124
相关产品推荐
相关产品推荐

