根据重叠时段对数据进行分组或求和

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/… 我的期望与上述解决方案不同。

以上是关于根据重叠时段对数据进行分组或求和的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 中对重叠的时间间隔进行分组

有效地对重叠的矩形进行分组

如何根据条件对sql中的行进行分组

PySpark - RDD 中对象的时间重叠

对具有重叠事件的稀疏时间序列数据的时间间隔求和

根据重叠目标将多个索引折叠成组