仅在日期间隙时递增 (Oracle SQL)

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

我的数据结构如下:

身份证 开始日期 结束日期
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 中执行此条件增量。拜托,请帮帮我吧

plsql oracle-sqldeveloper
1个回答
0
投票

为了在 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;
© www.soinside.com 2019 - 2024. All rights reserved.