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',您的输出中的日期在哪里?