SQL新手求助:如何筛选日期和数量均最小的目标行
解决你的SQL筛选问题
首先纠正你原SQL的两个核心问题:
- GROUP BY子句错误:你要按
code分组来定位每个code的最小日期,而不是同时按日期(你还拼写错成了Trabsact_date)和code分组——那样会把每个日期+code的组合都当成独立分组,根本达不到聚合找最小日期的目的。 - 聚合函数错误:
SUM(qty)完全不符合需求,你要找的是最小数量,不是求和;而且就算改成MIN(qty),单纯用GROUP BY也没法直接拿到对应这两个最小值的完整行(比如同一code的最小日期下有多个行时,GROUP BY会丢失具体行信息)。
推荐解法:窗口函数(适配MySQL8+、PostgreSQL、SQL Server等主流数据库)
用窗口函数可以给每一行按规则排序,直接筛选出每组里日期最小且数量最小的行,逻辑清晰易理解:
SELECT code, transact_date, qty FROM ( SELECT code, transact_date, qty, -- 按code分组,每组内先按日期升序(最小日期排第一),再按数量升序(同日期下最小数量排第一) ROW_NUMBER() OVER (PARTITION BY code ORDER BY transact_date ASC, qty ASC) AS row_num FROM your_table -- 替换成你的实际表名 ) AS sub_query WHERE row_num = 1; -- 只取每组排序第一的行,就是你要的黄色标记行
兼容旧版本数据库的解法:子查询关联
如果你的数据库不支持窗口函数,可以用两次子查询先锁定最小日期,再锁定该日期下的最小数量:
SELECT t.code, t.transact_date, t.qty FROM your_table t -- 关联子查询,找到每个code的最小交易日期 INNER JOIN ( SELECT code, MIN(transact_date) AS min_date FROM your_table GROUP BY code ) AS date_sub ON t.code = date_sub.code AND t.transact_date = date_sub.min_date -- 再关联子查询,找到每个code在最小日期下的最小数量 INNER JOIN ( SELECT code, transact_date, MIN(qty) AS min_qty FROM your_table GROUP BY code, transact_date ) AS qty_sub ON t.code = qty_sub.code AND t.transact_date = qty_sub.transact_date AND t.qty = qty_sub.min_qty;
内容的提问来源于stack exchange,提问作者Hakim E
相关产品推荐
相关产品推荐

