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 = 1RN = 2.我只需要RN = 2,或者如果RN = 2不存在,则返回RN = 1.

任何建议都将受到高度赞赏.

谢谢!

推荐答案

You can count rows in partition by Id. If there 1 row (count=1) then rn=1 - nothing to do. If count>1 then take RN=2.
Try this

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)

Sql相关问答推荐

Group By子句返回太多行

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

JSON列之间的Postgr聚合

SQL—如何根据2列填写缺失的值

收到%1、%2或%2邮箱的唯一客户

我可以在SQLite3中使用BLOB作为主键吗?

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

在UNION查询中查找MIN

删除行而不使数据库超载

根据标识符将两行合并为一行

Select 一个非零值减少重复

AdventureWorks 查询

在特定条件下使用 LAG,确定要采用什么 LAG 值?

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

获取上个月和上一年的值

如何根据共同列值从两个表中包含列,但只包含左表中的行

在给定的日期范围内填写缺失的日期

字符串从更改到表列和查询中的一行的转换错误

从多个连接返回 1 行到同一个表 - SQL Server

删除具有相同 ID 的重复记录 - Postgresql