我仍然在使用 BigQuery,希望您能幫助我。
我有一個過去 2 個月內來自不同用戶的故障狀態資料集,掃描每天進行一次。
基本上,我的資料集如下所示:
WITH failure_table AS
(SELECT 'Andrea' AS name, 'Failure' AS status, '2022-04-28 4:00:00' AS timestamp
UNION ALL SELECT 'Karl', 'Failure', '2022-04-28 4:00:00'
UNION ALL SELECT 'Andrea', 'Failure', '2022-04-27 4:00:00'
UNION ALL SELECT 'Karl', 'Failure', '2022-04-27 4:00:00'
UNION ALL SELECT 'Andrea', 'Failure', '2022-04-26 4:00:00'
UNION ALL SELECT 'Andrea', 'Failure', '2022-04-25 4:00:00'
UNION ALL SELECT 'Andrea', 'Failure', '2022-03-30 4:00:00'
UNION ALL SELECT 'Andrea', 'Failure', '2022-03-29 4:00:00'
UNION ALL SELECT 'Andrea', 'Failure', '2022-03-28 4:00:00'
UNION ALL SELECT 'Karl', 'Failure', '2022-03-28 4:00:00')
我想輸出的是用戶第一次提交失敗的時間戳,并且每天連續提交失敗狀態,直到今天(2022-04-29)。
所以在這種情況下,Andrea 和 Karl 從 3 月開始的失敗都不會被考慮分析,因為 3 月 30 日之后,他們有成功的標記,直到 4 月下旬才再次失敗。(我不確定我是否有意義,請告訴我)。
所以我的預期輸出是,
| 姓名 | 地位 | 開始失敗的時間戳 | 失敗的日子 |
|---|---|---|---|
| 安德烈亞 | 失敗 | 2022-04-25 4:00:00 | 4 |
| 卡爾 | 失敗 | 2022-04-27 4:00:00 | 2 |
我希望有人能幫幫忙。謝謝!
uj5u.com熱心網友回復:
使用以下方法
select name, status,
min(timestamp) as started_failing_timestamp,
date_diff(max(date(timestamp)), min(date(timestamp)), day) 1 as days_failing
from (
select * except(flag), flag, countif(flag > 1) over(partition by name order by timestamp) grp
from (
select *, date_diff(date(timestamp), lag(date(timestamp)) over(partition by name order by timestamp), day) flag
from failure_table
where status = 'Failure'
)
)
group by name, status, grp
qualify 1 = row_number() over(partition by name order by grp desc)
如果應用于您問題中的樣本資料 - 輸出是

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/467756.html
上一篇:根據組中其他值的平均值創建新列
