如何在T-SQL中用ROW_NUMBER写WHERE子句:无RN=2则返回RN=1
解决方案
可以通过在CTE中计算每个分组的最大行号,再根据这个最大值来决定返回RN=2还是RN=1的行,具体代码如下:
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY opened_at) RN, MAX(ROW_NUMBER() OVER (PARTITION BY id ORDER BY opened_at)) OVER (PARTITION BY id) AS MaxRN FROM table ) SELECT column1, column2 FROM CTE WHERE RN = CASE WHEN MaxRN >= 2 THEN 2 ELSE 1 END
思路说明
- 在CTE中新增
MaxRN字段,统计每个id分组下的最大行号,以此判断该分组是否存在RN=2的行。 - 通过
CASE语句做条件判断:如果分组的最大行号大于等于2,就筛选RN=2的行;如果最大行号仅为1,就筛选RN=1的行。这样每个分组只会返回符合要求的单行数据,不会同时返回RN=1和RN=2的行。
也可以用两层CTE实现,先计算每个分组的最大RN,再和原CTE关联筛选:
WITH RowCTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY opened_at) RN FROM table ), MaxRNCTE AS ( SELECT id, MAX(RN) AS MaxRN FROM RowCTE GROUP BY id ) SELECT r.column1, r.column2 FROM RowCTE r JOIN MaxRNCTE m ON r.id = m.id WHERE r.RN = CASE WHEN m.MaxRN >=2 THEN 2 ELSE 1 END
这两种写法都能满足需求,可根据实际场景选择使用。
内容的提问来源于stack exchange,提问作者dexter_walking
相关产品推荐
相关产品推荐

