sql - 根据时间范围聚合多行
问题描述
我确实有一个customer
,他在特定的时间段内使用不同的设备,并用 avalid_from
和valid_to
日期进行跟踪。但是,每次此设备发生某些变化时,都会写入一个新行,而不会对基于行的数据进行任何可见的更改,除了新的有效 from/to 之外。
我想要做的是aggregate
将前两行合二为一,对于 row3
和4
,同时离开5
和6
原样。到目前为止,我提出的所有解决方案都在为不切换回device a
. 一切都在失败。
我真的很感激一些帮助,在此先感谢!
解决方案
如果您知道 previousvalid_to
与 current 相同valid_from
,则可以使用lag()
来标识新分组的开始位置。然后使用累积和计算分组,最后聚合:
select cust, act_dev, min(valid_from), max(valid_to)
from (select t.*,
sum(case when prev_valid_to = valid_from then 0 else 1 end) over (partition by cust order by valid_from) as grouping
from (select t.*,
lag(valid_to) over (partition by cust, act_dev order by valid_from) as prev_valid_to
from t
) t
) t
group by cust, act_dev, grouping;
这是一个 db<>fiddle。
推荐阅读
- laravel - Laravel 8 查询生成器 WhereIn Like
- android - 我多次生成 apk 并且他没有以前的代码更改,但是在模拟器 android、iOS 和 iOS 财务设备中,更改显示了它
- reactjs - 如何从数据库 firebase 获取和渲染点
- python - 我怎样才能找到幂零矩阵?
- python - 尝试调用类中的函数时出现名称错误
- node.js - node.js 中的中间件优先级
- python - 造成这种差异的原因可能是什么?
- python-3.x - 清理同一字典中的重复项
- reactjs - 将 react-hook-form Controller 链接到状态值
- solr - Solr8-stored=false 字段显示在响应中