如何在T-SQL中编写带有row_number的WHERE子句?

问题描述 投票:0回答:2
WITH CTE AS 
(
    SELECT 
        *, 
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY opened_at) RN
    FROM 
        table
)
SELECT column1, column2
FROM CTE
WHERE RN = 2

如果没有

RN = 2
,我该如何返回
RN = 1

如果我编写类似的代码

WHERE RN = IIF (RN = 2,2,1)

它将返回具有 1 和 2 的行的

RN = 1
RN = 2
。我只需要
RN = 2
,或
RN = 1
,如果
RN = 2
不存在。

如有任何建议,我们将不胜感激。

谢谢!

sql t-sql where-clause ssms row-number
2个回答
2
投票

您可以通过获取每个 id 的 max rn 来做到这一点,其中 max rn <= 2 then apply a join to get the expected output :

WITH CTE AS (
SELECT *, ROW_NUMBER () OVER (PARTITION BY id ORDER BY opened_at) RN
FROM mytable
)
SELECT c.*
FROM CTE c
INNER JOIN (
  SELECT id, max(rn) as max_rn
  FROM CTE
  where rn <= 2
  GROUP BY id
) as s on s.id = c.id and s.max_rn = c.rn

0
投票

您可以通过Id统计分区中的行数。如果有 1 行 (count=1),则 rn=1 - 无需执行任何操作。如果 count>1 则取 RN=2。
试试这个

WITH CTE AS (
SELECT *, ROW_NUMBER () OVER (PARTITION BY id ORDER BY opened_at) RN
  , count (*) OVER (PARTITION BY id) qty
FROM table)

SELECT column1, column2
FROM CTE
WHERE (qty>1 and RN = 2) or (qty=1)
© www.soinside.com 2019 - 2024. All rights reserved.