Узнайте значения между диапазонами в SQL Server 2005 (SET BASED APPROACH)? - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть таблица, как

Id  Value
1   Start
2   Normal
3   End
4   Normal
5   Start
6   Normal
7   Normal
8   End
9   Normal

Я должен привести вывод как

id  Value
1   Start
2   Normal
3   End

5   Start
6   Normal
7   Normal
8   End

т.е. записи между началом и концом. Записи с идентификаторами 4 и 9 находятся за пределами начала и конца, поэтому в выходных данных их нет.

Как сделать это на основе множеств (SQLServer 2005)?

1 Ответ

4 голосов
/ 12 ноября 2009

Загрузить таблицу @t:

declare @t table(Id int,Value nvarchar(100));
insert into @t values (1,'Start'),(2,'Normal'),(3,'End'),(4,'Normal'),(5,'Start'),(6,'Normal'),(7,'Normal'),(8,'End'),(9,'Normal');

Запрос:

With RangesT as (
    select Id, (select top 1 Id from @t where Id>p.Id and Value='End' order by Id asc) Id_to
    from @t p
    where Value='Start'
)
select crossT.* 
from RangesT p
cross apply (
    select * from @t where Id>=p.Id and Id<=Id_to
) crossT
order by Id

Обратите внимание, что я предполагаю, что нет совпадений. Результат:

Id          Value
----------- ------
1           Start
2           Normal
3           End
5           Start
6           Normal
7           Normal
8           End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...