我的数据 struct 如下:

ID Begin Date End Date
1 1/1/2023 2/1/2023
1 2/2/2023 2/15/2023
1 2/20/2023 9/21/2023
1 9/22/2023 10/11/2023
2 1/11/2023 4/11/2023
2 5/9/2023 6/15/2023
2 7/7/2023 9/17/2023

我想分区的ID和创建一个行号,只有当有一个行的结束和下一个开始之间的差距(在ID组).

预期的结果如下所示:

ID Begin Date End Date Group
1 1/1/2023 2/1/2023 1
1 2/2/2023 2/15/2023 1
1 2/20/2023 9/21/2023 2
1 9/22/2023 10/11/2023 2
2 1/11/2023 4/11/2023 1
2 5/9/2023 6/15/2023 2
2 7/7/2023 9/17/2023 3

每次日期有差距时都会创建一个新的组,但只要日期没有差距,组就会一直存在.

我已经使用了一个超前/滞后函数来计算间隙,但是我不知道如何在Oracle SQL Developer中进行这种条件递增.求你了,求你帮帮我

推荐答案

要在Oracle SQL中实现所需的结果,可以使用LAG函数比较每个ID分区中当前行的开始日期和前一行的结束日期.根据比较结果,然后可以使用带有CASE语句的SUM窗口函数在检测到间隙时递增该组.

以下是一个示例查询:

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;

Sql相关问答推荐

Postgresql在加入时显示重复的行

Postgresql -如何计算刷卡和刷卡时间

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

出现5次后,将所有正斜杠替换为连字符

使用sede获取不一定有两个不同标签的所有问题

在多个联合中使用相同的SELECT SQL查询

收到%1、%2或%2邮箱的唯一客户

如何用客户名称计算sum(dr)和sum(cr)

通过对象分离实现原子性

SQL仅返回第一个字母在A-Z之间的值

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

特殊条件计算小计

SQL Server - 判断 ids 层次 struct 中的整数 (id)

查询中获取审批者不起作用

使用 GROUP BY 时如何创建其他组?

使用 regexp_replace 替换所有出现的特殊字符

忽略与给定列匹配的行的 LAG 函数

查找具有相同连接列数据的所有记录

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF

Snowflake SQL group-by 的行为不同,具体取决于列是按位置引用还是按别名引用