我的数据如下所示
Id1 Id2 Id3 Name Date
1 2 3A testA 4/1/2024
1 2 3A testB 4/1/2024
1 2 3A testC 4/1/2024
2 2 3A testA 4/1/2024
2 2 3A testB 4/2/2024
2 2 3A testC 4/3/2024
3 4 4A testD 4/6/2024
3 4 4A testE 4/7/2024
4 4 4A testD 4/6/2024
4 4 4A testE 4/7/2024
6 5 6A testF 4/6/2024
6 5 6A testG 4/7/2024
7 5 6A testF 4/6/2024
我尝试了以下查询,但它没有给我预期的结果
select * ,ROW_NUMBER() over (PARTITION BY Id1,Id2,Id3,Date order by Id1) rn
from TableA where rn=2
我期望结果 PARTITION 应该是相同的,并且如果所有内容都匹配并且每个分区中的记录数匹配,如下面的示例
Id1 Id2 Id3 Name Date
3 4 4A testD 4/6/2024
3 4 4A testE 4/7/2024
4 4 4A testD 4/6/2024
4 4 4A testE 4/7/2024
请让我知道我们如何使用其他功能来实现这一点
您是否要选择具有与该表中第二个不同
Id2
值匹配的 Id2
值的行?
如果是这样,您需要对不同的
Id2
值进行隔离和编号,筛选行号 2,然后将该连接连接回原始表。
SELECT A.*
FROM (
SELECT Id2, ROW_NUMBER() OVER(ORDER BY Id2) AS rn
FROM TableA
GROUP BY Id2
) S
JOIN TableA A ON A.Id2 = S.Id2
WHERE S.rn = 2
或者,将 Id2 选择器包装在子查询中,然后在 where 子句中使用该子查询。
SELECT A.*
FROM TableA A
WHERE A.Id2 = (
SELECT S.Id2
FROM (
SELECT Id2, ROW_NUMBER() OVER(ORDER BY Id2) AS rn
FROM TableA
GROUP BY Id2
) S
WHERE S.rn = 2
)
以上两项的结果:
Id1 | Id2 | Id3 | 姓名 | 日期 |
---|---|---|---|---|
3 | 4 | 4A | 测试D | 2024-04-06 |
3 | 4 | 4A | 测试E | 2024-04-07 |
4 | 4 | 4A | 测试D | 2024-04-06 |
4 | 4 | 4A | 测试E | 2024-04-07 |
选择第二个 Id2 值的另一种方法是使用
ORDER BY ... OFFSET ... FETCH
语法。
SELECT DISTINCT Id2
FROM TableA
ORDER BY Id2 OFFSET 1 ROW FETCH NEXT 1 ROW ONLY
然后可以将其替换为之前的查询。
请参阅 this db<>fiddle 进行演示。