sql - 如果结果保持不变,如何获取最小日期和最大日期
问题描述
我有一个地址 SCD 类型 2 表,但有时输入的信息保持不变我想编写一个查询,如果信息未更改,则保留以前的开始数据并将结束日期设置为最大值,例如
OBJID BEGDA ENDDA HASHROW_COL RK
83022088 2012-03-30 2012-10-28 e1-ef-a9-36 1
83022088 2012-10-29 2013-09-07 63-69-e5-25 2
83022088 2013-09-08 2014-08-30 e1-ef-a9-36 3
83022088 2014-08-31 2016-11-26 e1-ef-a9-36 4
83022088 2016-11-27 9999-12-31 e1-ef-a9-36 5
请注意,从第 3 行到第 5 行,HASHROW_COL 保持不变。
Desired result:
OBJID BEGDA ENDDA HASHROW_COL RK
83022088 2012-03-30 2012-10-28 e1-ef-a9-36 1
83022088 2012-10-29 2013-09-07 63-69-e5-25 2
83022088 2013-09-08 9999-12-31 e1-ef-a9-36 3
查询至今
select a.objid, a.hashrow_col,
case when a.objid <> b.objid then b.begda
when a.hashrow_col = b.hashrow_col and (b.begda - interval '1' day <= a.endda) then
a.begda end,
case when a.objid <> b.objid then b.endda
when (a.hashrow_col = b.hashrow_col) and (b.begda - interval '1' day <= a.endda) and b.endda > a.endda
then b.endda
end,
from
(select objid, begda, endda, HASHROW_COL,
from OTABLE ) a
inner join
(select objid, begda, endda, HASHROW_COL,
from OTABLE) b
on
a.objid = b.objid
where
and a.objid = '83022088'
order by a.OBJID, a.BEGDA, a.HASHROW_COL;
解决方案
这是一个差距和孤岛问题。在这种情况下,我会使用:
select objid, min(begda), max(endda), HASHROW_COL,
row_number() over (partition by objid order by min(begda)) as ranking
from (select t.*,
sum(case when prev_endda = begda - interval '1' day then 0 else 1 end) over (partition by objid order by begda) as grouping
from (select t.*,
lag(endda) over (partition by objid, HASHROW_COL order by begda) as prev_endda
from t
) t
) t
group by grouping, objid, HASHROW_COL;
推荐阅读
- algorithm - 在线 DFS(人工智能)中的问题
- javascript - 如何在laravel中的分页期间保持复选框处于选中状态
- xamarin - 如何更改 Xamarin Shell 选项卡栏上图标的位置
- java - 如何在 Spring 数据中获取大小的嵌套对象
- javascript - 如何将点击事件添加到按钮数组及其位置?
- scheme - 球拍语言输出问题
- android - 从 Fragment 打开 Activity 后如何保持底部导航视图?
- python - 如何交换在我的 while 循环开始时运行的函数?
- es6-modules - 如何开发和测试 Svelte 组件
- kubernetes - Kubernetes 远程访问仪表板