【发布时间】:2021-01-13 22:28:02
【问题描述】:
我必须创建一个查询来查找日期之间的差距和孤岛。这似乎是一个标准的差距和孤岛问题。为了显示我的问题,我将使用数据样本。查询在 Snowflake 中执行。
CREATE TABLE TEST (StartDate date, EndDate date);
INSERT INTO TEST
SELECT '8/20/2017', '8/21/2017' UNION ALL
SELECT '8/22/2017', '9/22/2017' UNION ALL
SELECT '8/23/2017', '9/23/2017' UNION ALL
SELECT '8/24/2017', '8/26/2017' UNION ALL
SELECT '8/28/2017', '9/19/2017' UNION ALL
SELECT '9/23/2017', '9/27/2017' UNION ALL
SELECT '9/25/2017', '10/10/2017' UNION ALL
SELECT '10/17/2017','10/18/2017' UNION ALL
SELECT '10/25/2017','11/3/2017' UNION ALL
SELECT '11/3/2017', '11/15/2017';
这段代码给了我一个表格示例。
然后我就有了寻找缝隙和孤岛的代码:
SELECT
MIN(StartDate) AS IslandStartDate,
MAX(EndDate) AS IslandEndDate
FROM
(
SELECT
*,
CASE WHEN PreviousEndDate >= StartDate THEN 0 ELSE 1 END AS IslandStartInd,
SUM(CASE WHEN PreviousEndDate >= StartDate THEN 0 ELSE 1 END) OVER (ORDER BY Groups.RN) AS IslandId
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY StartDate,EndDate) AS RN,
StartDate,
EndDate,
LAG(EndDate,1) OVER (ORDER BY StartDate, EndDate) AS PreviousEndDate
FROM
TEST
) Groups
) Islands
GROUP BY
IslandId
ORDER BY
IslandStartDate
结果是:
如您所见,问题出现在 2017 年 8 月 28 日至 2017 年 9 月 19 日期间。 此期间不应是一个单独的岛屿,因为它应包含在以下期间:8/23/2017 - 9/23/2017。
您知道如何修改我的查询以获得正确的结果(因此 6 我应该有 5 个岛,因为 2017 年 8 月 28 日 - 2017 年 9 月 19 日不应该是岛)。这只是数据示例,所以我正在寻找通用解决方案,但到目前为止我还没有找到正确的方法。
【问题讨论】:
-
用您正在使用的数据库标记您的问题。
标签: sql gaps-and-islands