SQL - раздел в сопоставимом наборе - PullRequest
1 голос
/ 23 мая 2019

Внутри этой таблицы @t:

s   e   Status
4   5   Available
6   7   Available
8   9   WL
10  11  Available
12  14  Available

Я хотел бы вернуть набор данных, например:

s   e   Status
4   7   Available
8   9   WL
10  14  Available

, по сути, сгруппировать мой столбец состояния в непрерывные наборы, зная, что данныеупорядочено по s, и в каждой последующей строке значение s будет на один больше, чем предыдущее значение e.

Я думаю, мне нужно разделить данные с помощью запроса, подобного этому:

select ROW_NUMBER() OVER (Partition by status, s order by s, e, status) As Row_number, *
from @t
order by s

но результаты разбиваются некорректно.

Какой правильный синтаксис?

1 Ответ

0 голосов
/ 23 мая 2019

Это проблема пробелов и островков. Если на таймфреймах нет пропусков, вы можете использовать разницу номеров строк:

select status, min(s) as s, max(e) as e
from (select t.*, 
             row_number() over (order by s) as seqnum,
             row_number() over (partition by status order by s) as seqnum_s
      from @t t
     ) t
group by status, (seqnum - seqnum_s)
order by min(s);

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...