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
不存在。
如有任何建议,我们将不胜感激。
谢谢!
您可以通过获取每个 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
您可以通过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)