我的数据结构如下:
身份证 | 开始日期 | 结束日期 |
---|---|---|
1 | 2023 年 1 月 1 日 | 2023 年 2 月 1 日 |
1 | 2023 年 2 月 2 日 | 2023年2月15日 |
1 | 2023 年 2 月 20 日 | 2023 年 9 月 21 日 |
1 | 2023 年 9 月 22 日 | 2023年10月11日 |
2 | 2023 年 1 月 11 日 | 2023 年 4 月 11 日 |
2 | 2023 年 5 月 9 日 | 2023 年 6 月 15 日 |
2 | 2023年7月7日 | 2023 年 9 月 17 日 |
我想按 ID 进行分区并创建一个行号,仅当一行的末尾与下一行的开头(在 ID 组内)之间存在间隙时该行号才会递增。
期望的结果如下所示:
身份证 | 开始日期 | 结束日期 | 团体 |
---|---|---|---|
1 | 2023 年 1 月 1 日 | 2023 年 2 月 1 日 | 1 |
1 | 2023 年 2 月 2 日 | 2023年2月15日 | 1 |
1 | 2023 年 2 月 20 日 | 2023 年 9 月 21 日 | 2 |
1 | 2023 年 9 月 22 日 | 2023年10月11日 | 2 |
2 | 2023 年 1 月 11 日 | 2023 年 4 月 11 日 | 1 |
2 | 2023 年 5 月 9 日 | 2023 年 6 月 15 日 | 2 |
2 | 2023年7月7日 | 2023 年 9 月 17 日 | 3 |
每次日期有间隙时都会创建一个新组,但只要日期没有间隙,该组就会继续存在。
我使用了超前/滞后函数来计算间隙,但我不知道如何在 Oracle SQL Developer 中执行此条件增量。拜托,请帮帮我吧
为了在 Oracle SQL 中获得所需的结果,您可以使用 LAG 函数将每个 ID 分区中当前行的开始日期与前一行的结束日期进行比较。根据比较,您可以使用 SUM 窗口函数和 CASE 语句来在检测到间隙时增加 Group。
这是一个示例查询:
WITH DateRanges AS (
SELECT
ID,
"Begin Date",
"End Date",
LAG("End Date") OVER (PARTITION BY ID ORDER BY "Begin Date") AS PrevEndDate
FROM YourTable
)
SELECT
ID,
"Begin Date",
"End Date",
SUM(CASE WHEN "Begin Date" > NVL(PrevEndDate, TO_DATE('1900-01-01', 'YYYY-MM-DD')) THEN 1 ELSE 0 END) OVER (PARTITION BY ID ORDER BY "Begin Date") AS Group
FROM DateRanges;