【问题标题】:Review sessions from timestamp column with start/stop event with duplicate start/stop records从带有重复开始/停止记录的开始/停止事件的时间戳列中查看会话
【发布时间】:2021-04-19 10:00:49
【问题描述】:

我有以下案例变更记录:

id case_id state time_created
1 100 REVIEW_NEEDED 2021-03-30 15:11:58.015907000
2 100 REVIEW_NEEDED 2021-04-01 13:08:17.945926000
3 100 REVIEW 2021-04-07 06:20:48.873865000
4 100 WAITING 2021-04-07 06:32:47.159664000
5 100 REVIEW_NEEDED 2021-04-09 06:32:51.132127000
6 100 REVIEW 2021-04-12 04:39:36.426467000
7 100 REVIEW 2021-04-12 04:40:36.000000000
8 100 CLOSED 2021-04-12 04:40:43.133736000
9 101 REVIEW_NEEDED 2021-03-30 20:37:58.015907000
10 101 REVIEW 2021-04-04 13:08:17.945926000
11 101 CLOSED 2021-04-06 06:20:48.873865000
12 101 CLOSED 2021-04-06 06:20:50.000000000

我想报告以下这些会话:

open_id close_id case_id waiting_time_start handling_time_start handling_time_end
1 4 100 2021-03-30 15:11:58.015907000 2021-04-07 06:20:48.873865000 2021-04-07 06:32:47.159664000
5 8 100 2021-04-09 06:32:51.132127000 2021-04-12 04:39:36.426467000 2021-04-12 04:40:43.133736000
9 11 101 2021-03-30 20:37:58.015907000 2021-04-04 13:08:17.945926000 2021-04-06 06:20:48.873865000

Waiting_time_start:当状态 = REVIEW_NEEDED

Handling_time_start:当 state = REVIEW

Handling_time_end:当状态 = WAITING 或 CLOSED

我目前的解决方案是对每个案例的 Waiting_time_startHandling_time_startHandling_time_end 进行排名,然后将这些事件加入排名,但这是由于存在重复记录,因此并不完美,因此每个案例的开始/停止事件的数量可能会有所不同。

非常感谢您的任何想法!

【问题讨论】:

    标签: sql duplicates snowflake-cloud-data-platform window-functions gaps-and-islands


    【解决方案1】:

    这是相当复杂的。首先添加基于“等待”和“关闭”计数的分组——但仅当它们更改值时:

    select t.*,
           sum(case when (state <> next_state or next_state is null) and
                         state in ('WAITING', 'CLOSED')
                    then 1 else 0
               end) over (partition by caseid order by time_created desc) as grouping
    from (select t.*,
                 lead(state) over (partition by caseid order by time_created) as next_state
          from t
         ) t
    

    然后,你可以聚合:

    with cte as (
          select t.*,
                 sum(case when (state <> next_state or next_state is null) and
                               state in ('WAITING', 'CLOSED')
                          then 1 else 0
                     end) over (partition by caseid order by time_created desc) as grouping
          from (select t.*,
                       lead(state) over (partition by caseid order by time_created) as next_state
                from t
               ) t
         )
    select caseid, min(id), max(id),
           min(case when status = 'REVIEW_NEEDED' then time_created end),
           min(case when status = 'REVIEW' then time_created end),
           max(time_created)
    from cte
    group by grouping, caseid;
    

    【讨论】:

    • 谢谢,效果很好。 (虽然这两个代码 sn-ps 应该交换)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多