根据给定的输入获取上一个和下一个数据

问题描述 投票:0回答:2

我有下表和示例数据:

表格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
sql sql-server sql-server-2008-r2
2个回答
0
投票

我已在表中添加了递增的主键列,我们将获得所需的上一行和下一行范围的临时列表。

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)

0
投票

这是您在删除的另一篇文章中提出的问题的答案。它与此问题以及您对此主题的其他问题类似。]

© www.soinside.com 2019 - 2024. All rights reserved.