首页 > 解决方案 > SQL Server:如何找到最大长度连续范围?

问题描述

我有一个包含一个整数列 (signed) 的表NUM

在每一行中,该表都包含一个随机数。每个数字在表中出现任意次数。

我需要找到表中存在的连续(不丢失数字)范围的最大长度,考虑错过。

min(NUM) max(NUM) 范围内的数字(其中 SQL 的 min 和 max 函数)

标签: sql-server

解决方案


这听起来像是一个典型的差距和孤岛问题:

SELECT TOP 1 MIN(num) num_from, MAX(num) num_upto, COUNT(DISTINCT num) num_count
FROM (
    SELECT num, SUM(num_changed) OVER (ORDER BY num) num_groupno
    FROM (
        SELECT num, CASE WHEN LAG(num) OVER (ORDER BY num) BETWEEN num - 1 AND num THEN 0 ELSE 1 END num_changed
        FROM (VALUES
            (1),
            (2),
            (3),

            (5),
            (6),
            (7),
            (7),
            (8),

            (10)
        ) v(num)
    ) cte1
) cte2
GROUP BY num_groupno
ORDER BY COUNT(DISTINCT num) DESC

结果:

num_from    num_upto    num_count
5           8           4

推荐阅读