在 SQL Server 中查找整数聚合中的第一个间隙

Ted*_*erz 6 sql-server aggregate

假设我有一个名为 dbo.GroupAssignment 的表。

组ID | 秩
------------------
1 1
1 2
1 3
2 1
2 3
2 4
3 2
3 4
3 5

PK是GroupID,Rank。通常,组内的等级是从 1 开始的连续整数序列。但是 GroupAssignment 可能会被删除,留下一个间隙。当为小组做出新的分配时,我想填补第一个可用的空白。

那么,我如何在 SQL Server 中计算它呢?

gbn*_*gbn 7

您可以使用 ROW_NUMBER 生成排名应该是什么

;WITH ranks AS
(
    SELECT
       GroupID, Rank, 
       ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY Rank) AS newRank
    FROM 
       dbo.GroupAssignment
)
SELECT
   GroupID, MIN(newRank), MIN(Rank)
FROM
   ranks
WHERE
   newRank < Rank -- don't need <> here
GROUP BY
   GroupID;
Run Code Online (Sandbox Code Playgroud)

就个人而言,如果其中之一适用,我不会重复使用此排名

  • 它可以在运行时使用 ROW_NUMBER 等生成
  • 它是某种 ID 列:旧值将存在于历史表等中,并且会产生歧义
  • 它只是一个任意的内部密钥

另外,您是否希望RANK 或 DENSE_RANK处理“联合第 2 次”或“相等值”而不是 ROW_NUMBER

  • @Tedderz - 他的意思是两个并列的值,例如第二名。您希望紧跟在它们之后的值排名第三(`DENSE_RANK`)还是第四(只是`RANK`,并且没有任何值的排名第三)? (2认同)

小智 6

自连接可以解决问题吗?

select MIN(a.rank)+1 from dbo.GroupAssignment a
left join dbo.GroupAssignment b on a.GroupID = b.GroupID AND a.rank+1 = b.rank
where a.GroupID = ? and b.rank is null
Run Code Online (Sandbox Code Playgroud)