You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:30:04