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
相关产品推荐
相关产品推荐

