如何用T-SQL实现按OrderId去重并优先保留Code2记录
如何用T-SQL实现按OrderId保留指定优先顺序的记录?
原始数据表
| OrderId | Code | Val |
|---|---|---|
| 1 | Code1 | abc |
| 2 | Code2 | def |
| 3 | Code1 | aaa |
| 3 | Code2 | bbb |
期望结果
| OrderId | Code | Val |
|---|---|---|
| 1 | Code1 | abc |
| 2 | Code2 | def |
| 3 | Code2 | bbb |
需求说明
每个OrderId仅保留一条记录;若同一OrderId存在多个Code值,优先保留Code2。
你尝试的代码
select OrderId, Code, count(*) from Table1 group by OrderId, Code
解决方案
可以使用ROW_NUMBER()窗口函数实现需求,通过自定义排序规则给Code2更高的优先级,再筛选每个OrderId的第一条记录:
WITH RankedOrders AS ( SELECT OrderId, Code, Val, -- 按OrderId分组,Code2优先排在前面,生成行号 ROW_NUMBER() OVER ( PARTITION BY OrderId ORDER BY CASE WHEN Code = 'Code2' THEN 1 ELSE 2 END ) AS RowNum FROM Table1 ) SELECT OrderId, Code, Val FROM RankedOrders WHERE RowNum = 1;
说明
PARTITION BY OrderId:将数据按OrderId分组,每组单独计算行号ORDER BY CASE WHEN Code = 'Code2' THEN 1 ELSE 2 END:自定义排序规则,让Code2的记录行号为1,其他Code的行号为2- 最后筛选
RowNum = 1的记录,即可得到每个OrderId的优先保留记录
内容的提问来源于stack exchange,提问作者Annas
相关产品推荐
相关产品推荐

