组内Postgremin/max日期范围



我们有一个事务表,它存储数据,就像历史表一样,任何时候状态(或其他属性(发生变化时,它都会生效。

示例:

Product | Status   | Start Date | End Date
----------+------- --+------------+-----------
widget a  | active   | 02/01/2020 | 02/30/2020
widget a  | active   | 03/01/2020 | 03/19/2020
widget a  | inactive | 03/20/2020 | 05/01/2020
widget a  | active   | 05/02/2020 | 08/31/2020
widget b  | active   | 02/01/2020 | 05/31/2020
widget b  | inactive | 06/01/2020 | 06/31/2020

随着状态的变化,我试图根据最短和最长日期汇总这些数据(正如我所说,其他属性会导致记录的变化,但我只关心状态的变化(。因此,在上面的示例中,"小部件a"将有三条记录:从2020年1月2日到2020年3月19日处于活动状态,从2020年3日到2020月5日处于非活动状态,以及从2020年2月5日到2020年底8月31日处于活动状态。使用ETL工具可以很容易地做到这一点,但我想把它放在一个视图中。

在注意性能的同时,最好的方法是什么

这是postgresql 10

这是一个缺口和孤岛问题,需要将具有相同产品和状态的相邻行分组在一起。

以下是一种使用行号之间的差异来构建组的方法:

select product, status, min(start_date) start_date, max(end_date) end_date
from (
select t.*, 
row_number() over(partition by product order by start_date) rn1,
row_number() over(partition by product, status order by start_date) rn2
from mytable t
) t
group by product, rn1 - rn2

相关内容

  • 没有找到相关文章

最新更新