Sql server SQL Server:如何找到最大长度连续范围?
我有一个表,其中包含一个整数列,有符号NUM 在每一行中,此表包含一个随机数。每个数字在表中可以找到任意次数 我需要找到一个连续的最大长度而不丢失数字范围, 表中有,则考虑遗漏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
在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;