根据重叠时段对数据进行分组或求和
Posted
技术标签:
【中文标题】根据重叠时段对数据进行分组或求和【英文标题】: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,引入了两行,一用于重叠行,另一行用于非重叠行。
还可以根据任何条件单独获取非重叠数据吗?我想将重叠的数据单独移动到临时表,我可以将不重叠的数据直接移动到输出表。
【问题讨论】:
【参考方案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/… 我的期望与上述解决方案不同。以上是关于根据重叠时段对数据进行分组或求和的主要内容,如果未能解决你的问题,请参考以下文章