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

Oracle大数据场景下非递归实现按条件累加缺勤天数方案咨询

解决方案

核心思路

先计算每条记录对应周的有效缺勤天数(即缺勤区间与当前周的重叠天数),再通过窗口函数按ID累计全周期天数,全程无需递归,适配大数据量场景。

具体SQL实现

SELECT
    ID,
    WeekStartDate,
    AbsentFrom,
    AbsentTo,
    -- 计算当前周的有效缺勤天数:取缺勤区间与本周的重叠天数
    GREATEST(
        0,
        LEAST(AbsentTo, TRUNC(WeekStartDate, 'IW') + 6)
        - GREATEST(AbsentFrom, TRUNC(WeekStartDate, 'IW'))
        + 1
    ) AS WeeklyAbsentDays,
    -- 按ID累计全周期缺勤天数
    SUM(
        GREATEST(
            0,
            LEAST(AbsentTo, TRUNC(WeekStartDate, 'IW') + 6)
            - GREATEST(AbsentFrom, TRUNC(WeekStartDate, 'IW'))
            + 1
        )
    ) OVER (
        PARTITION BY ID
        ORDER BY WeekStartDate
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS TotalAbsentDays
FROM your_table
ORDER BY ID, WeekStartDate;

关键细节说明

  1. 周区间计算:

    • 用TRUNC(WeekStartDate, 'IW')获取ISO周的周一起始(若你的周以周日为起始,替换为'WW'),TRUNC(...) + 6即为当周周日。
    • 通过GREATEST和LEAST取缺勤区间与周区间的交集,确保计算的是实际在本周内的缺勤天数,避免负数结果。
  2. 累计逻辑:

    • 窗口函数SUM(...) OVER (PARTITION BY ID ORDER BY WeekStartDate)按ID分组,按周起始日期排序,累计从第一行到当前行的有效缺勤天数。
    • 显式指定ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(默认行为,显式写更清晰),确保累计范围正确。
  3. 性能优化:

    • 给ID和WeekStartDate创建联合索引:CREATE INDEX idx_id_weekstart ON your_table(ID, WeekStartDate);,窗口函数的分组和排序会直接利用该索引,大幅减少大数据量下的排序开销。
    • 若表已按WeekStartDate分区,查询性能会进一步提升。

常见问题排查

若之前用SUM()未得到预期结果,大概率是以下原因:

  • 未正确计算跨周缺勤的有效天数(比如直接用AbsentTo - AbsentFrom +1,未与周区间做交集);
  • 窗口函数未按WeekStartDate正确排序,导致累计顺序混乱;
  • 未处理缺勤区间与周区间无重叠的情况,出现负数天数影响累计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:12