Печатать пустую строку после каждой группы строк - PullRequest
0 голосов
/ 10 октября 2018

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

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

Таблица:

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

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

insert into PreTest values(111,123,'2018-01-01','00:10:11'),
                          (111,124,'2018-01-01','00:10:12'),
                          (111,125,'2018-01-01','00:10:17'),
                          (111,126,'2018-01-01','00:10:16'),
                          (111,127,'2018-01-01','00:10:13');
insert into PreTest values(111,228,'2018-01-02','10:13:01'),
                            (111,229,'2018-01-02','10:13:11'),
                            (111,125,'2018-01-02','10:13:02'),
                            (111,237,'2018-01-02','10:13:30'),
                            (111,232,'2018-01-01','10:13:04');
insert into PreTest values(111,339,'2018-01-03','11:10:01'),
                            (111,338,'2018-01-03','11:10:04'),
                            (111,125,'2018-01-03','11:10:02'),
                            (111,340,'2018-01-03','00:10:11'),
                            (111,333,'2018-01-01','11:10:03');

Запрос:

WITH C1 AS
(
    SELECT ROW_NUMBER() OVER(order by col3,col4) rn,*
    FROM PreTest
)
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 - 2 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 + 2 FROM C1 WHERE col2 = '125')
) a

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

rn                   col1        col2        col3       col4
-------------------- ----------- ----------- ---------- ----------------
4                    111         127         2018-01-01 00:10:13.0000000
5                    111         126         2018-01-01 00:10:16.0000000
6                    111         125         2018-01-01 00:10:17.0000000
7                    111         132         2018-01-01 10:13:04.0000000
8                    111         232         2018-01-01 10:13:04.0000000

12                   111         128         2018-01-02 10:13:01.0000000
13                   111         130         2018-01-02 10:13:02.0000000
14                   111         125         2018-01-02 10:13:02.0000000
15                   111         229         2018-01-02 10:13:11.0000000
16                   111         129         2018-01-02 10:13:11.0000000

22                   111         139         2018-01-03 11:10:01.0000000
23                   111         141         2018-01-03 11:10:02.0000000
24                   111         125         2018-01-03 11:10:02.0000000
25                   111         338         2018-01-03 11:10:04.0000000
26                   111         138         2018-01-03 11:10:04.0000000

1 Ответ

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

Хотя я согласен с Шоном, что нет веской причины когда-либо хотеть сделать это в SQL Server, в отличие от уровня представления, это можно сделать.

Вам нужно будет использовать gaps and islandsподход, чтобы определить, в какой момент ваши группы меняются, и вставить искусственную строку пустых значений в этих точках в ORDER BY.

Это означает, что если вы хотите пустую строку между строками № 4 и 5, вы бынужно CAST номер строки в виде десятичной дроби и добавить пустую строку с номером строки 4.5 или что-то в этом роде.

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