我有一个包含以下数据的表:
Action Code Place Date
Remove A Place 1 2019-03-15
Install A Place 2 2019-10-01
Remove A Place 2 2022-07-12
Install A Place 3 2023-01-01
有两种可能的动作。“删除”和“安装”。如何找到给定日期的代码A场所?例如,2015年将是地方1。2020年将是地方2。2025年将是地方3。
我认为第一步也是最困难的一步,就是将其转换为包含开始日期和结束日期的表。然后,我可以使用之间的功能。
输出示例:
A Place StartDate EndDate
A Place 1 1900-01-01 2019-03-15 -- we dont have start date so we can use for ex. 1900
A Place 2 2019-10-01 2022-07-12
A Place 3 2023-01-01 3000-01-01 -- we dont have end date so we can use for ex. 3000
我曾尝试过LEAD / LAG,但是我们在这里有两种不同的操作,因此我认为这不是最好的主意。我该如何解决这个问题?
谢谢。
我明白。以下用于union all
确保它获取所有值。
select code, place, '1900-01-01' as startdate, date as enddate
from (select t.*, row_number() over (partition by code order by date) as seqnum
from t
) t
where seqnum = 1 and action = 'Remove'
union all
select code, place, date as startdate, enddate
from (select t.*,
lead(date, 1, '3000-01-01') over (partition by code order by date) as enddate
from t
) t
where action = 'Install';
第一个子查询处理数据以开头的情况'Remove'
。第二个记录将全部'installs'
记录下来,并将日期设置为下一个记录。
请注意,即使位置在数据中交错,这也将起作用(因此,代码会在一段时间后返回到位置)。
这是db <>小提琴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句