我有下表和示例数据:
表格:DummyData
CREATE TABLE DummyData
(
ID int,
Dates_Range VARCHAR(50)
);
样本数据:
INSERT INTO DummyData VALUES(1,'2019-01-01');
INSERT INTO DummyData VALUES(1,'2019-01-02');
INSERT INTO DummyData VALUES(1,'2019-01-03');
INSERT INTO DummyData VALUES(NULL,'2019-01-04 - 2019-02-01');
INSERT INTO DummyData VALUES(1,'2019-02-02');
INSERT INTO DummyData VALUES(2,'2019-01-06');
INSERT INTO DummyData VALUES(NULL,'2019-01-07');
INSERT INTO DummyData VALUES(2,'2019-01-08');
INSERT INTO DummyData VALUES(2,'2019-01-09');
INSERT INTO DummyData VALUES(3,'2019-01-02');
INSERT INTO DummyData VALUES(3,'2019-01-03');
INSERT INTO DummyData VALUES(NULL,'2019-01-04 - 2019-01-09');
INSERT INTO DummyData VALUES(3,'2019-01-10');
查询:我需要查找NULL
ID之前和之后的n个数字数据。
例如1:我需要从NULL
ID之前和之后找到1个数据,然后输出将是:
ID DRange
-------------------------------
1 2019-01-03
NULL 2019-01-04 - 2019-02-01
1 2019-02-02
2 2019-01-06
NULL 2019-01-07
2 2019-01-08
3 2019-01-03
NULL 2019-01-04 - 2019-01-09
3 2019-01-10
例如2:我需要从NULL
ID之前和之后找到2个数据,然后输出将是:
ID DRange
-------------------------------
1 2019-01-02
1 2019-01-03
NULL 2019-01-04 - 2019-02-01
1 2019-02-02
2 2019-01-06
NULL 2019-01-07
2 2019-01-08
2 2019-01-09
3 2019-01-02
3 2019-01-03
NULL 2019-01-04 - 2019-01-09
3 2019-01-10
例如3:我需要从NULL
ID之前和之后找到3个数据,然后输出将是:
ID DRange
-------------------------------
1 2019-01-01
1 2019-01-02
1 2019-01-03
NULL 2019-01-04 - 2019-02-01
1 2019-02-02
2 2019-01-06
NULL 2019-01-07
2 2019-01-08
2 2019-01-09
3 2019-01-02
3 2019-01-03
NULL 2019-01-04 - 2019-01-09
3 2019-01-10
我已在表中添加了递增的主键列,我们将获得所需的上一行和下一行范围的临时列表。
DECLARE @MyList TABLE (Value INT)
INSERT INTO @MyList VALUES (1)
INSERT INTO @MyList VALUES (2)
select ID,Dates_Range from DummyData where PiD in (select PiD+Value as myCollection from (
select Pid from DummyData where id is null
) a
cross join
@MyList
union all
select PiD-Value from (
select Pid from DummyData where id is null
) a
cross join
@MyList ) or id is null
此结果将是
ID Dates_Range
1 2019-01-02
1 2019-01-03
NULL 2019-01-04 - 2019-02-01
1 2019-02-02
2 2019-01-06
NULL 2019-01-07
2 2019-01-08
2 2019-01-09
3 2019-01-02
3 2019-01-03
NULL 2019-01-04 - 2019-01-09
3 2019-01-10
如果我们仅在列表中插入一个值,我们将拥有此查询部分
DECLARE @MyList TABLE (Value INT)
INSERT INTO @MyList VALUES (1)
select ID,Dates_Range from DummyData where PiD in (select PiD+Value as myCollection from (
-
结果将是
ID Dates_Range
1 2019-01-03
NULL 2019-01-04 - 2019-02-01
1 2019-02-02
2 2019-01-06
NULL 2019-01-07
2 2019-01-08
3 2019-01-03
NULL 2019-01-04 - 2019-01-09
3 2019-01-10
现在MyList表中什么也没有,结果将如下所示
ID Dates_Range
NULL 2019-01-04 - 2019-02-01
NULL 2019-01-07
NULL 2019-01-04 - 2019-01-09
如果您只想添加3列,则>]
INSERT INTO @MyList VALUES (1)
INSERT INTO @MyList VALUES (2)
INSERT INTO @MyList VALUES (3)
这是您在删除的另一篇文章中提出的问题的答案。它与此问题以及您对此主题的其他问题类似。]