Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找日期的连续范围_Sql_Sql Server - Fatal编程技术网

Sql 查找日期的连续范围

Sql 查找日期的连续范围,sql,sql-server,Sql,Sql Server,我们如何从以下场景中找到连续的日期范围 Id modifiedDate StartDate EndDate 1 2019-01-01 2019-01-01 2019-12-31 1 2019-02-02 2019-02-01 2019-02-28 1 2019-02-27 2019-01-15 2019-03-15 1 2019-03-01 2019-03-01 2019-03-12 2 2019-01-01 2019-01-01

我们如何从以下场景中找到连续的日期范围

Id  modifiedDate  StartDate   EndDate
1   2019-01-01    2019-01-01  2019-12-31
1   2019-02-02    2019-02-01  2019-02-28
1   2019-02-27    2019-01-15  2019-03-15
1   2019-03-01    2019-03-01  2019-03-12
2   2019-01-01    2019-01-01  2019-03-01
2   2019-05-01    2019-05-01  2019-08-01
我想显示的输出是:

   Id  StartDate    EndDate
   1   2019-01-01   2019-01-15
   1   2019-01-15   2019-02-01
   1   2019-02-01   2019-02-28
   1   2019-02-28   2019-03-01
   1   2019-03-01   2019-03-12
   1   2019-03-12   2019-03-15
   1   2019-03-15   2019-12-31
   2   2019-01-01   2019-03-01
   2   2019-05-01   2019-08-01
到目前为止,我尝试的是:

With X As(
  Select a.StartDate,a.EndDate,b.StartDate,b.EndDate
  From table a Full Join table b ON a.endDate>b.StartDate
  Where a.StartDate<>b.StartDate and b.endDate<>a.Enddate
)
Select StartDate,Enddate,Min(StartDtae)
From X
Group By StartDate,EndDate
对于第一个id,我可以执行union和fix,但对于第二个id,我无法按照union过程显示所需的输出。

您可以尝试此操作

WITH CTE
AS
(
    SELECT DISTINCT id,Date, ROW_NUMBER() OVER(PARTITION BY id ORDER BY Date) RN
    FROM
    (
        SELECT Id,StartDate Date FROM your_table
        UNION ALL
        SELECT Id,EndDate  FROM your_table
    ) A
)

SELECT A.Id, A.Date StartDate,B.Date EndDate 
FROM CTE A
INNER JOIN CTE B ON A.Id = B.Id AND A.RN = B.RN - 1
你可以试试这个

WITH CTE
AS
(
    SELECT DISTINCT id,Date, ROW_NUMBER() OVER(PARTITION BY id ORDER BY Date) RN
    FROM
    (
        SELECT Id,StartDate Date FROM your_table
        UNION ALL
        SELECT Id,EndDate  FROM your_table
    ) A
)

SELECT A.Id, A.Date StartDate,B.Date EndDate 
FROM CTE A
INNER JOIN CTE B ON A.Id = B.Id AND A.RN = B.RN - 1

为什么id 2的第一行的结束日期为“2019-03-01”,但未被视为下一行的起始日期?因为id 2在3个月和5个月之间无效,以及排除此项的验证方式。除了这些列之外,我们没有其他内容。我们只需检查日期为什么id 2的第一行的结束日期为“2019-03-01”,但不被视为下一行的起始日期?因为id 2在3到5个月之间无效,以及如何验证排除该日期?除了这些列之外,我们没有其他内容。我们只需检查日期。该逻辑将不满足Id 2。如果我尝试对Id 2执行此操作,则得到的输出为3行,但Id 2在2019-03-01到2019-05之间无效-01@Naveen132:在上一个问题中,我会问第一行的结束日期发生了什么。i、 e;'2019-12-31',输出中的日期在哪里?此逻辑将不满足Id 2。如果我尝试此操作,则Id 2的输出为3行,但Id 2在2019-03-01到2019-05之间无效-01@Naveen132:在上一个问题中,我会问第一行的结束日期发生了什么。i、 e;'2019-12-31',您的输出中的日期在哪里?