Sql server SQL Server:如何找到最大长度连续范围?

Sql server SQL Server:如何找到最大长度连续范围?,sql-server,Sql Server,我有一个表,其中包含一个整数列,有符号NUM 在每一行中,此表包含一个随机数。每个数字在表中可以找到任意次数 我需要找到一个连续的最大长度而不丢失数字范围, 表中有,则考虑遗漏 在minNUM maxNUM范围内的数字,其中SQL的min和max函数这听起来像是一个典型的间隙和孤岛问题: SELECT TOP 1 MIN(num) num_from, MAX(num) num_upto, COUNT(DISTINCT num) num_count FROM ( SELECT num, S

我有一个表,其中包含一个整数列,有符号NUM

在每一行中,此表包含一个随机数。每个数字在表中可以找到任意次数

我需要找到一个连续的最大长度而不丢失数字范围, 表中有,则考虑遗漏


在minNUM maxNUM范围内的数字,其中SQL的min和max函数

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

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

欢迎来到SO。提供一些您想要的示例数据和示例输出。这是一个很好的开始。读这个。
--make test data
select 1 as val into #test;

insert #test (val) 
values (1),(1),(2),(3),(4),(4),(5),(7),(8),(9),(10),(11),(12),(13);

select * from #test;

--With command to find start and end of 'ranges'
--then join start of range to its corresponding end, with length
--then list the longest ranges (with ties)
;WITH LB AS (SELECT t1.val from #test t1 LEFT JOIN #test t2 on t1.val - 1 = t2.val WHERE t2.val is null),
      UB AS (SELECT t1.val from #test t1 LEFT JOIN #test t2 on t1.val + 1 = t2.val WHERE t2.val is null),
      Ranges AS (SELECT DISTINCT LB.val s, Q.val e,q.val-lb.val + 1 cnt FROM LB 
                        CROSS APPLY  
                            (SELECT TOP 1 val FROM UB WHERE UB.val >= LB.val  ORDER BY UB.val) Q)
      SELECT TOP 1 with ties * FROM Ranges order by cnt DESC


drop table #test;