仅当分区中的所有行都相同时才对数据进行分区的行号

问题描述 投票:0回答:1

我的数据如下所示

 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

请让我知道我们如何使用其他功能来实现这一点

sql sql-server sql-server-2012
1个回答
0
投票

您是否要选择具有与该表中第二个不同

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 进行演示。

© www.soinside.com 2019 - 2024. All rights reserved.