SQL - 根据日期映射行
SQL - map rows based on dates
我正在查看一些未使用 ID 等明确链接的案例数据。如果最近案例的 open_date
与 close_date
匹配,我们可以判断两个案例是相关联的另一种情况,这两种情况具有相同的 type
(请求)。我想检查一下过去是否有任何案例被推迟,以及被推迟了多少次。例如,下面的 case12 被推迟了两次——一次是从 case11 开始的,而 case11 本身是从 case9 推迟的。 case7 也被推迟了两次,而 case1 和 case2 从未被推迟。我认为这需要一个递归解决方案,但不确定如何实现。
case_id open_date close_date user_id type status
case12 2021-06-01 2021-08-25 user1 request complete
case11 2021-05-01 2021-06-01 user1 request deferred
case9 2021-03-01 2021-05-01 user1 request deferred
case7 2020-09-15 2020-10-31 user1 request saved
case5 2020-09-01 2020-09-15 user1 request deferred
case3 2020-02-12 2020-09-01 user1 request deferred
case2 2019-04-01 2019-06-01 user1 request partial
case1 2018-06-01 2018-06-17 user1 request partial
考虑以下方法
select *,
case row_number() over(partition by user_id, type, map_id order by open_date)
when 1 then 'new case'
when count(1) over(partition by user_id, type, map_id) then 'last deferred case'
else 'deferred case'
end as status
from (
select * except(new_case),
countif(new_case) over(partition by user_id, type order by open_date) as map_id
from (
select *,
open_date != lead(close_date) over(partition by user_id, type order by open_date desc) new_case
from your_table
)
)
-- order by open_date desc
如果应用于您问题中的示例数据
with your_table as (
select 'case12' case_id, '2021-06-01' open_date, '2021-08-25' close_date, 'user1' user_id, 'request' type union all
select 'case11', '2021-05-01', '2021-06-01', 'user1', 'request' union all
select 'case9', '2021-03-01', '2021-05-01', 'user1', 'request' union all
select 'case7', '2020-09-15', '2020-10-31', 'user1', 'request' union all
select 'case5', '2020-09-01', '2020-09-15', 'user1', 'request' union all
select 'case3', '2020-02-12', '2020-09-01', 'user1', 'request' union all
select 'case2', '2019-04-01', '2019-06-01', 'user1', 'request' union all
select 'case1', '2018-06-01', '2018-06-17', 'user1', 'request'
)
输出是
希望您能将以上示例应用到您的实际用例中
我正在查看一些未使用 ID 等明确链接的案例数据。如果最近案例的 open_date
与 close_date
匹配,我们可以判断两个案例是相关联的另一种情况,这两种情况具有相同的 type
(请求)。我想检查一下过去是否有任何案例被推迟,以及被推迟了多少次。例如,下面的 case12 被推迟了两次——一次是从 case11 开始的,而 case11 本身是从 case9 推迟的。 case7 也被推迟了两次,而 case1 和 case2 从未被推迟。我认为这需要一个递归解决方案,但不确定如何实现。
case_id open_date close_date user_id type status
case12 2021-06-01 2021-08-25 user1 request complete
case11 2021-05-01 2021-06-01 user1 request deferred
case9 2021-03-01 2021-05-01 user1 request deferred
case7 2020-09-15 2020-10-31 user1 request saved
case5 2020-09-01 2020-09-15 user1 request deferred
case3 2020-02-12 2020-09-01 user1 request deferred
case2 2019-04-01 2019-06-01 user1 request partial
case1 2018-06-01 2018-06-17 user1 request partial
考虑以下方法
select *,
case row_number() over(partition by user_id, type, map_id order by open_date)
when 1 then 'new case'
when count(1) over(partition by user_id, type, map_id) then 'last deferred case'
else 'deferred case'
end as status
from (
select * except(new_case),
countif(new_case) over(partition by user_id, type order by open_date) as map_id
from (
select *,
open_date != lead(close_date) over(partition by user_id, type order by open_date desc) new_case
from your_table
)
)
-- order by open_date desc
如果应用于您问题中的示例数据
with your_table as (
select 'case12' case_id, '2021-06-01' open_date, '2021-08-25' close_date, 'user1' user_id, 'request' type union all
select 'case11', '2021-05-01', '2021-06-01', 'user1', 'request' union all
select 'case9', '2021-03-01', '2021-05-01', 'user1', 'request' union all
select 'case7', '2020-09-15', '2020-10-31', 'user1', 'request' union all
select 'case5', '2020-09-01', '2020-09-15', 'user1', 'request' union all
select 'case3', '2020-02-12', '2020-09-01', 'user1', 'request' union all
select 'case2', '2019-04-01', '2019-06-01', 'user1', 'request' union all
select 'case1', '2018-06-01', '2018-06-17', 'user1', 'request'
)
输出是
希望您能将以上示例应用到您的实际用例中