如何查询各Store ID每日最大总数量及对应日期?SQL去重求助
问题分析与修正方案
原SQL的两处核心问题
- 子查询分组错误:子查询里
GROUP BY time, storeid, Quantity多了Quantity字段。你要计算的是门店每日总数量,应该只按日期(或时间)和门店分组,加了Quantity会把同一门店同一时间下,不同数量值的记录拆分开统计,导致qty_sum根本不是当日该门店的总数量,而是相同Quantity值的小计,完全偏离需求。 - 外层分组逻辑不符合需求:外层按
日期+门店分组,输出的是每个门店每天的总数量,自然会出现重复的Store ID(一个门店有多少天数据就会出现多少次),这和你要“每个Store ID只返回最大日总量及对应日期”的需求不匹配。
修正后的SQL(SQL Server环境)
WITH daily_store_total AS ( -- 第一步:正确计算每个门店每日的总数量 SELECT CONVERT(date, Time) AS store_date, storeid, SUM(quantity) AS daily_qty_sum FROM table1 GROUP BY CONVERT(date, Time), storeid ), ranked_daily_total AS ( -- 第二步:对每个门店的日总量按从高到低排名 SELECT store_date, storeid, daily_qty_sum, ROW_NUMBER() OVER (PARTITION BY storeid ORDER BY daily_qty_sum DESC) AS rn FROM daily_store_total ) -- 第三步:筛选出每个门店排名第一的记录(即日总量最大的那条) SELECT store_date, storeid, daily_qty_sum FROM ranked_daily_total WHERE rn = 1 ORDER BY daily_qty_sum DESC;
补充说明
- 用
CONVERT(date, Time)替代你原来的dateadd(dd,0,datediff(dd,0,Time)),功能完全一致,写法更简洁。 - 如果某个门店有多个日期的总数量并列最大,上面的SQL只会返回其中一条;如果需要返回所有并列的日期,把
ROW_NUMBER()换成RANK()即可。
内容的提问来源于stack exchange,提问作者rshoot
相关产品推荐
相关产品推荐

