MySQL - 查询以查找连续范围的未使用值

标签 mysql sql performance algorithm

我有一个包含从 0 到某个大数 N 的整数值的表,但有一些数字间隙。我正在尝试编写一个高效的查询,它会找到第一组连续值,这些值的长度在 0 和 N 之间,但包含在所述表中.这具有查找未使用的 ID 等的应用程序。

例如,给定集合

[1,2,3,4,10,11,12,13,14,15]

,找到不在集合中的连续 5 个数字的范围。应该是

[5,6,7,8,9]

.我如何在一个单一的、高效的查询中写这个?谢谢。

最佳答案

这是SQL Server MVP Deep Dives书中关于这个主题的精彩章节。

http://www.manning.com/nielsen/SampleChapter5.pdf

解决方法之一

WITH StartingPoints AS
(
SELECT seqval, ROW_NUMBER() OVER(ORDER BY seqval) AS rownum
FROM dbo.NumSeq AS A
WHERE NOT EXISTS
(SELECT *
FROM dbo.NumSeq AS B
WHERE B.seqval = A.seqval - 1)
),
EndingPoints AS
(
SELECT seqval, ROW_NUMBER() OVER(ORDER BY seqval) AS rownum
FROM dbo.NumSeq AS A
WHERE NOT EXISTS
(SELECT *
FROM dbo.NumSeq AS B
WHERE B.seqval = A.seqval + 1)
)
SELECT S.seqval AS start_range, E.seqval AS end_range
FROM StartingPoints AS S
JOIN EndingPoints AS E
ON E.rownum = S.rownum;

关于MySQL - 查询以查找连续范围的未使用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328557/

相关文章:

mysql - 在没有-p的情况下使用my.ini从命令行访问mysql.exe?

mysql - 从 MySQL 表的特定行中检索值

c# - 如何从 C# 数据表在 MySql 中创建临时表?

python - 当字符串包含空格时,Django 过滤器 icontains 不返回结果 - mysql.connector.django

mysql - SQL 使用参数/值对解析一个长的 varchar 字段

java - 调用bean时Primefaces RemoteCommand时滞

c++ - 将数据保存在 std::vector 或 .txt 文件中是否更快?

java - Integer.valueOf() 和 Autoboxing 之间的性能差异是什么

java - 在多列上使用投影 - 连接表

sql - 输出 Inserted.Id 和另一个字段