Выберите последовательность строк - PullRequest
0 голосов
/ 11 апреля 2019

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

ID | Type
---------
1  | 1
2  | 2
3  | 2
4  | 2
5  | 1
6  | 2
7  | 2

Мне нужен способ SQL для выбора строк типа 2 между строками типа 1, передавая идентификатор строки

Пример:

Selecting rows after ID 1

Wanted result:
ID | Type
---------
2  | 2
3  | 2
4  | 2

Selecting rows after ID 5

Wanted result:
ID | Type
---------
6  | 2
7  | 2

Заранее благодарю за помощь

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Это один из возможных вариантов.

CREATE TABLE SampleData(
    ID int, 
    Type int);
INSERT INTO SampleData
VALUES
(1, 1),
(2, 2),
(3, 2),
(4, 2),
(5, 1),
(6, 2),
(7, 2);
DECLARE @ID int =1;--Parameter

DECLARE @NextID int = (SELECT TOP 1 ID 
                       FROM SampleData 
                       WHERE ID > @ID 
                       AND Type = 1 
                       ORDER BY ID);

SELECT *
FROM SampleData
WHERE Type = 2
AND ID > @ID
AND (ID < @NextID OR @NextID IS NULL);

Это пример того, как создать встроенную табличную функцию.

CREATE FUNCTION GetSubset(
    @ID int 
)
RETURNS TABLE
AS
RETURN 
    SELECT *
    FROM SampleData sd
    WHERE sd.Type = 2
    AND sd.ID > @ID
    AND sd.ID <= ISNULL((SELECT TOP 1 i.ID 
                       FROM SampleData i
                       WHERE i.ID > @ID 
                       AND i.Type = 1 
                       ORDER BY i.ID), sd.ID);
1 голос
/ 11 апреля 2019

Вот один метод:

select t.*
from t
where t.id > 5 and
      t.type = 2 and
      t.id < coalesce( (select min(t2.id)
                        from t t2
                        where t2.id > 5 and
                              t2.type = 1
                       ), 999999999
                     );

Или более элегантно, как:

select t.*
from t
where t.id > 5 and
      t.type = 2 and
      t.id < all (select t2.id
                  from t t2
                  where t2.id > 5 and
                        t2.type = 1
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...