【问题标题】:Group or Sum the data based on overlapping period根据重叠时段对数据进行分组或求和
【发布时间】:2021-01-14 16:14:00
【问题描述】:

我正在将旧系统数据迁移到新系统。我正在尝试根据更改的日期迁移具有历史记录的数据。我当前的查询结果低于输出。

由于是旧系统,部分数据属于同一时期。我想根据 id 和 name 对数据进行分组,并根据数据属于同一时期将值添加为活动记录或非活动记录。

我的预期输出:

例如,我们以 119 为例进行说明。一行标记为黄色,因为它不属于其他行之间的任何重叠时段,但其他两行与 01-No-18 到 30-Sep-19 的时段重叠。

我需要拆分重叠期间的数据,并仅添加重叠期间的值。所以我需要根据日期寻找组合,结果是引入两行非重叠的结果到两行以下

重叠行的另一行

同样的场景适用于 148324,引入了两行,一用于重叠行,另一行用于非重叠行。

还可以根据任何条件单独获取非重叠数据吗?我想将重叠的数据单独移动到临时表,我可以将不重叠的数据直接移动到输出表。

【问题讨论】:

    标签: sql oracle oracle12c


    【解决方案1】:

    我认为我没有 100% 的解决方案,但很难确定哪些数据是正确的以及它们如何排序。

    此查询基于lead/lag 分析函数。我必须按顺序(未来和过去)将 NULL 值更改为足够的值。

    请尝试修改此查询,我希望它适合您的情况。

    我的桌子:

    查询:

    SELECT id,name,value,startdate,enddate, 
    CASE WHEN nvl(next_startdate,29993112)>nvl(prev_enddate,19900101) THEN 'Y' ELSE 'N' END AS active 
    FROM
    (
    SELECT datatable.*,
    lag(enddate) over (partition by id,name order by startdate,value desc) prev_enddate,
    lead(startdate) over (partition by id,name order by startdate,value desc) next_startdate
    FROM datatable
    ) dt
    

    结果:

    【讨论】:

    • 感谢您的回答,但它不起作用。我在dbfiddle.uk/… 中添加了相同的内容
    • 你必须尝试改变你需要的大小写。这适用于这种情况:dbfiddle.uk/…
    • 我的期望与上述解决方案不同。
    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多