кажется, что вы пытаетесь найти острова в num
Ф.О. r различные значения id
. Это относительно распространенная проблема, поэтому вы найдете несколько ответов в SO, которые касаются островов.
Существуют различные способы для достижения этой цели, но один из самых простых описана в разделе «Нормальные острова» в Solving Gaps and Islands:
WITH C AS
(
SELECT id,num, num - DENSE_RANK() OVER(ORDER BY id,num) AS grp
FROM islandtest
)
SELECT id,MIN(num) AS rangestart, MAX(num) AS rangeend
FROM C
GROUP BY grp,id;
Внутри каждого острова, как num
и DENSE_RANK
увеличиваются на 1 для каждого последующего ряда , что означает, что значение num - DENSE_RANK
остается постоянным и может использоваться как идентификатор острова.
На следующем острове DENSE_RANK
будет по-прежнему увеличиваться на 1, но num
будет увеличиваться на другую сумму, поэтому на следующем острове будет установлен другой идентификатор острова.
После того, как у вас есть идентификатор острова можно сгруппировать по ней и получить минимальные, максимальные значения num
Тестирование с помощью этого сценария:
declare @islandtest table (Id int, num int);
insert into @islandtest values
(0,1),
(0,2),
(2,2),
(2,5);
WITH C AS
(
SELECT id,num, num - DENSE_RANK() OVER(ORDER BY id,num) AS grp
FROM @islandtest
)
SELECT id,MIN(num) AS rangestart, MAX(num) AS rangeend
FROM C
GROUP BY grp,id;
производит требуемый результат:
id rangestart rangeend
----------- ----------- -----------
0 1 2
2 2 2
2 5 5
Я не вижу никакой логики, с которой у вас есть три разных диапазона для 'id = 0'. – Amadan
Какой тэг "sql" связан с "html table"? –
@MaciejLos, мне нужен sql-запрос. это всего лишь пример. –