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

MS SQL按number去重并筛选最早日期的全列查询问题

在Microsoft SQL中按number去重并选取日期最早、ID最小的完整行

你之前的查询语句报错,是因为SQL的GROUP BY规则要求:SELECT列表里的非聚合函数列必须全部出现在GROUP BY子句中。你只GROUP BY了number,但id、name既没在GROUP BY里,也没被聚合函数包裹,所以触发了这个错误。而且就算把这些列都加到GROUP BY里,也没法保证拿到你要的“日期最早、ID最小”的对应行,因为GROUP BY会把同number的行合并,没法精准筛选目标记录。

针对你的需求,用**窗口函数ROW_NUMBER()**是最直接的方案,它能在每个number分组内给行排序,然后我们只取排序后行号为1的记录,就能拿到符合要求的完整行:

WITH ranked_rows AS (
    SELECT 
        id, name, number, date,
        ROW_NUMBER() OVER (
            PARTITION BY number 
            ORDER BY date ASC, id ASC
        ) AS row_num
    FROM my_table
)
SELECT id, name, number, date
FROM ranked_rows
WHERE row_num = 1;

逻辑说明:

  • PARTITION BY number:按number字段分组,把相同number的行归为一组
  • ORDER BY date ASC, id ASC:每个分组内先按date升序(最早的日期排在前面),如果日期相同,再按id升序(id更小的排在前面)
  • ROW_NUMBER():给每个分组内的行按上面的规则编号,符合要求的目标行编号就是1
  • 最后从CTE里筛选出row_num = 1的行,就是你要的所有列数据

针对你的示例数据,执行后的结果:

id      name       number         date
2       bar         2222       01-12-2022
3       baz         3333       12-30-2022
4      foobar       1111       02-01-2022

内容的提问来源于stack exchange,提问作者pileup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:39:36