我需要通过将开始日期和结束日期与之前的日期进行比较来清理表上的期间组,以查看是否存在相等.
一个例子胜过千言万语:
my key | start date | end date | tech date |
---|---|---|---|
A | 2022-05-01 | 9999-12-31 | 2022-05-01 |
A | 2023-01-01 | 9999-12-31 | 2023-01-01 |
A | 2023-01-01 | 2023-05-01 | 2023-05-01 |
A | 2023-07-01 | 9999-12-31 | 2023-07-01 |
因此,我需要确定两个时期:
my key | start date | end date |
---|---|---|
A | 2022-05-01 | 2023-05-01 |
A | 2023-07-01 | 9999-12-31 |
我想到的一个 Select 是,当开始日期或结束日期与前一行相同(按技术日期排序)时对我的数据进行"分组":
my key | start date | end date | tech date | group | comment |
---|---|---|---|---|---|
A | 2022-05-01 | 9999-12-31 | 2022-05-01 | 1 | first group of key A |
A | 2023-01-01 | 9999-12-31 | 2023-01-01 | 1 | same group as previous because end dates are equals |
A | 2023-01-01 | 2023-05-01 | 2023-05-01 | 1 | same group as previous because start dates are equals |
A | 2023-07-01 | 9999-12-31 | 2023-07-01 | 2 | new group because start and end dates are different from the previous row |
然后计算开始日期为该组的最小值,结束日期为该组的最大值(需要时不包括9999-12-31)
但我很难正确地对行进行分组,我try 了分析函数,但我找不到一种方法来获得前一个计算组:
select mykey, startdate, enddate, techdate,
case when lag(startdate,1,startdate) over (partition by mykey order by techdate) = startdate
or lag(enddate,1,enddate) over (partition by mykey order by techdate) = enddate
then lag(grp,1,grp) over (partition by mykey order by techdate)
else grp
end as calc_grp
from (select mykey, startdate, enddate, techdate, row_number() over (partition by mykey order by techdate) as grp from mytable)
我try 了一些这样的查询,但当然不起作用 我应该使用LAG(calc_grp...),但这是不可能的
你有什么办法实现这一点吗?
如果这是不可能的,我应该能够用另一种方法计算正确的值.