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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:59:57