You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Oracle分析函数查询任务时间范围内的重复日期?

找出同一任务和医生下的重复覆盖日期

输入表

Task#DoctorFromDayToDay
1Bar37
1Bar68
2Bar13
2Bar29
3Bar12
3Bar67

需求说明

提取同一Task#和Doctor下,被多个时间区间重复覆盖的日期,最终输出格式如下:

期望输出

Task#DoctorDay
1Bar6
1Bar7
2Bar2
2Bar3

解决方案思路

  1. 为每个时间区间生成包含所有日期的序列;
  2. 按Task#、Doctor、Day分组,统计每个日期的覆盖次数;
  3. 筛选出覆盖次数≥2的日期,即为重复覆盖的目标日期。

SQL实现(Oracle环境)

WITH date_ranges AS (
    SELECT 
        Task#,
        Doctor,
        FromDay + LEVEL - 1 AS Day
    FROM 
        your_table
    CONNECT BY 
        LEVEL <= ToDay - FromDay + 1
        AND PRIOR Task# = Task#
        AND PRIOR Doctor = Doctor
        AND PRIOR SYS_GUID() IS NOT NULL -- 避免多区间产生笛卡尔积
),
date_counts AS (
    SELECT 
        Task#,
        Doctor,
        Day,
        COUNT(*) AS occurrence
    FROM 
        date_ranges
    GROUP BY 
        Task#,
        Doctor,
        Day
)
SELECT 
    Task#,
    Doctor,
    Day
FROM 
    date_counts
WHERE 
    occurrence >= 2
ORDER BY 
    Task#,
    Day;

代码解释

  • date_ranges CTE:借助Oracle的CONNECT BY语法,为每个FromDay到ToDay的区间生成完整的日期序列,PRIOR SYS_GUID() IS NOT NULL用于确保每个独立区间生成自身的日期序列,避免交叉循环。
  • date_counts CTE:对每个任务、医生维度下的日期进行计数,统计每个日期被不同区间覆盖的次数。
  • 最终筛选出覆盖次数≥2的日期,即为重复覆盖的目标日期,按任务号和日期排序输出。

其他数据库适配说明

如果使用非Oracle数据库,生成日期序列的方式需调整:

  • PostgreSQL:用generate_series(FromDay, ToDay)替代CONNECT BY生成日期序列;
  • MySQL 8.0+:用递归CTE来生成连续日期序列。

内容的提问来源于stack exchange,提问作者OracleDBACurios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:50:06