Найти до и после ввода записи - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующая таблица, чтобы найти заданное значение до и после значений.

Например, хотите показать 1 значение до и после указанного столбца col2 значение 125.

Таблица:

CREATE TABLE PreTest1
(
 col1 int,
 col2 int,
 col3 date,
 col4 time
);

Пример данных:

insert into PreTest1 values(111,124,'2018-01-01','00:10:11'),
                          (111,124,'2018-01-01','00:10:12'),
                          (111,122,'2018-01-01','00:10:17'),
                          (111,125,'2018-01-01','00:10:16'),
                          (111,125,'2018-01-01','00:10:13'),
                          (111,123,'2018-01-01','00:10:19'),
                          (111,130,'2018-01-01','00:10:18'),
                          (111,123,'2018-01-01','00:10:17'),
                          (111,121,'2018-01-01','00:09:11');

Запрос:

WITH C1 AS
(
    SELECT ROW_NUMBER() OVER(order by col2,col3,col4) rn,*
    FROM PreTest1
)
SELECT * FROM 
(

    SELECT * FROM C1 WHERE rn IN (SELECT rn FROM C1 WHERE col2 = '125')
    UNION 
    SELECT * FROM C1 WHERE rn IN ( SELECT rn - 1 FROM C1 WHERE col2 = '125') 
    UNION       
    SELECT * FROM C1 WHERE rn IN ( SELECT rn + 1 FROM C1 WHERE col2 = '125') 
) a

Ожидаемый результат :

col1        col2        col3       col4
----------- ----------- ---------- ----------------
111         124         2018-01-01 00:10:12.0000000
111         125         2018-01-01 00:10:16.0000000
111         123         2018-01-01 00:10:17.0000000

1 Ответ

0 голосов
/ 11 октября 2018

Как то так?

WITH TMP1 AS
(
    SELECT ROW_NUMBER() OVER(partition by col1, col2 order by col3 desc, col4 desc) rang1, *
    FROM PreTest1
),
TMP2 as (
select ROW_NUMBER() OVER(order by col3 , col4, col2 desc) rang2, * 
from tmp1 where rang1=1
),
ValueRang as 
(
SELECT rang2 Position FROM TMP2 where col2=125
)
select * from tmp2
cross apply ValueRang
where tmp2.rang2 between Position-1 and Position + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...