在每组行后打印空行
Print blank line after each group of rows
我有以下 table 来查找给定值的前后行。
例如,想要显示给定列 col2
值 125
前后的 2 行,并且还想在每组之后打印空行。
Table:
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
虽然我同意 Sean 的观点,没有充分的理由想在 SQL 服务器而不是表示层中执行此操作,但可以做到。
您将需要使用 gaps and islands
方法来确定您的组在哪个点发生变化,并在 ORDER BY 中的那些点插入一个人工的空白值行。
这意味着如果您想要在第 4 行和第 5 行之间有一个空白行,您需要将行号转换为小数并添加一个带有行号 4.5 或类似行号的空白行。
我有以下 table 来查找给定值的前后行。
例如,想要显示给定列 col2
值 125
前后的 2 行,并且还想在每组之后打印空行。
Table:
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
虽然我同意 Sean 的观点,没有充分的理由想在 SQL 服务器而不是表示层中执行此操作,但可以做到。
您将需要使用 gaps and islands
方法来确定您的组在哪个点发生变化,并在 ORDER BY 中的那些点插入一个人工的空白值行。
这意味着如果您想要在第 4 行和第 5 行之间有一个空白行,您需要将行号转换为小数并添加一个带有行号 4.5 或类似行号的空白行。