如何在Snowflake中有条件地获取第一个值?

问题描述 投票:0回答:1

我在 Snowflake 中有

events
表,每个事件一行。
status
可以是 failed (表示错误)或 completed (表示错误已解决)。对于每个
customer_id
,我想找到两个时间戳
resolved_at
first_failed_at
,并最终计算这两个时间戳之间的错误分辨率(以天为单位)。如何实现这一目标?

我像这样找到

resolved_at
,但找不到
first_failed_at
。 请注意,可能会有多个事件连续失败。

with windowed as (
    select 
        *,
        lag(status) over (partition by customer_id order by created_at) as prev_status,
        lead(status) over (partition by customer_id order by created_at) as next_status,
        lead(created_at) over (partition by customer_id order by created_at) as next_created_at
    from events
)

select 
    event_id,
    customer_id,
    status,
    created_at,
    case 
        when status = 'failed' and next_status = 'completed' then next_created_at
        else null
    end as resolved_at
from windowed

这是示例数据和两个额外的所需列:

+--------------------------------------+-------------+-----------+---------------------+---------------------+---------------------+
|               event_id               | customer_id |  status   |     created_at      |     resolved_at     |   first_failed_at   |
+--------------------------------------+-------------+-----------+---------------------+---------------------+---------------------+
| e7921c9c-aa8f-49bb-83fa-31fa37d629ee | a           | completed | 2024-01-16 16:23:31 |                     |                     |
| 1d6a5bdf-e254-441d-9574-821844dc6c05 | a           | failed    | 2024-01-17 19:17:33 |                     | 2024-01-17 19:17:33 |
| 1a06783a-2ca4-4f68-80f0-7e7c84ac57fd | a           | failed    | 2024-01-22 18:07:54 |                     | 2024-01-17 19:17:33 |
| 61ecc8da-1e7f-4b19-92f1-fda93661a3af | a           | failed    | 2024-01-23 17:54:12 | 2024-01-24 19:34:48 | 2024-01-17 19:17:33 |
| 068e4220-bd57-410a-85f3-1fbb18f86053 | a           | completed | 2024-01-24 19:34:48 |                     |                     |
| 4ad30d16-ff13-48f3-b315-8a588d869c08 | a           | completed | 2024-01-25 17:30:54 |                     |                     |
| 82f8c57a-0e80-4ea6-96ad-3b578e5ec68a | a           | failed    | 2024-01-27 17:45:11 |                     | 2024-01-27 17:45:11 |
| 17d736d6-40de-4440-a220-e4a0612acb71 | a           | failed    | 2024-01-28 17:51:15 | 2024-01-29 17:23:31 | 2024-01-27 17:45:11 |
| be657472-69d0-4cd5-82e0-b33434ff213a | a           | completed | 2024-01-29 17:23:31 |                     |                     |
| 3bce3901-2639-489d-8280-04518a253b33 | b           | failed    | 2023-12-15 15:06:32 |                     | 2023-12-15 15:06:32 |
| 99b1bd8b-0ac3-4868-b687-73fc93ef9ddf | b           | failed    | 2023-12-16 15:07:21 | 2023-12-17 15:10:42 | 2023-12-15 15:06:32 |
| 406b42e6-63c6-402e-9519-87240d007315 | b           | completed | 2023-12-17 15:10:42 |                     |                     |
| 946e4c25-db5a-44e4-8c29-d7144ff5b03c | c           | failed    | 2023-12-15 15:06:10 |                     | 2023-12-15 15:06:10 |
| ba0c96d2-4b68-43e5-99a6-0f30530dd1ad | c           | failed    | 2023-12-16 15:06:32 |                     | 2023-12-15 15:06:10 |
+--------------------------------------+-------------+-----------+---------------------+---------------------+---------------------+
sql snowflake-cloud-data-platform window-functions
1个回答
0
投票

请参阅 SQL Server 示例。

with windowed as (
 select *,
  lag(status) over (partition by customer_id order by created_at) as prev_status,
  lead(status) over (partition by customer_id order by created_at) as next_status,
  lead(created_at) over (partition by customer_id order by created_at) as next_created_at,
  coalesce(sum(case when status='completed' then 1 else 0 end) 
     over (partition by customer_id order by created_at 
           rows between unbounded preceding and 1 preceding),0) as groupNum
 from events
)

select 
    event_id,
    customer_id,
    status,
    created_at,
    groupNum,
    max(case when status='completed' then created_at end)
        over(partition by customer_id,groupNum) resolved_at
from windowed

查询输出

事件_id 客户 ID 状态 创建于 组数 已解决_at
e7921c9c-aa8f-49bb-83fa-31fa37d629ee a 已完成 2024-01-16 16:23:31.000 0 2024-01-16 16:23:31.000
1d6a5bdf-e254-441d-9574-821844dc6c05 a 失败了 2024-01-17 19:17:33.000 1 2024-01-24 19:34:48.000
1a06783a-2ca4-4f68-80f0-7e7c84ac57fd a 失败了 2024-01-22 18:07:54.000 1 2024-01-24 19:34:48.000
61ecc8da-1e7f-4b19-92f1-fda93661a3af a 失败了 2024-01-23 17:54:12.000 1 2024-01-24 19:34:48.000
068e4220-bd57-410a-85f3-1fbb18f86053 a 已完成 2024-01-24 19:34:48.000 1 2024-01-24 19:34:48.000
4ad30d16-ff13-48f3-b315-8a588d869c08 a 已完成 2024-01-25 17:30:54.000 2 2024-01-25 17:30:54.000
82f8c57a-0e80-4ea6-96ad-3b578e5ec68a a 失败了 2024-01-27 17:45:11.000 3 2024-01-29 17:23:31.000
17d736d6-40de-4440-a220-e4a0612acb71 a 失败了 2024-01-28 17:51:15.000 3 2024-01-29 17:23:31.000
be657472-69d0-4cd5-82e0-b33434ff213a a 已完成 2024-01-29 17:23:31.000 3 2024-01-29 17:23:31.000
3bce3901-2639-489d-8280-04518a253b33 b 失败了 2023-12-15 15:06:32.000 0 2023-12-17 15:10:42.000
99b1bd8b-0ac3-4868-b687-73fc93ef9ddf b 失败了 2023-12-16 15:07:21.000 0 2023-12-17 15:10:42.000
406b42e6-63c6-402e-9519-87240d007315 b 已完成 2023-12-17 15:10:42.000 0 2023-12-17 15:10:42.000
946e4c25-db5a-44e4-8c29-d7144ff5b03c c 失败了 2023-12-15 15:06:10.000 0
ba0c96d2-4b68-43e5-99a6-0f30530dd1ad c 失败了 2023-12-16 15:06:32.000 0
© www.soinside.com 2019 - 2024. All rights reserved.