2015-02-16 3 views
0

Я хочу разделить некоторые таблицы SQL диапазоновНайти последовательные значения из таблицы в SQL

эта таблица должна быть приоткрыта,

Id num 
0 1 
0 2 
2 2 
2 5 

результата будет так,

идентификатора, минимальная, максимальная

id min  max 
0 1 2 
2 2 2 
2 5 5 
+0

Я не вижу никакой логики, с которой у вас есть три разных диапазона для 'id = 0'. – Amadan

+2

Какой тэг "sql" связан с "html table"? –

+0

@MaciejLos, мне нужен sql-запрос. это всего лишь пример. –

ответ

2

кажется, что вы пытаетесь найти острова в 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 
+0

Ты потрясающий. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^