我需要一些幫助來根據另一列中的類別對一列的后續值求和,直到該類別達到新值。這是我的資料的樣子
id | site_id | date_id | hour_id | location_id | status | status_minutes
1 1 20210101 1 1 Offline 60
2 1 20210101 2 1 Offline 57
3 1 20210101 2 1 Available 3
4 1 20210101 3 1 Available 20
5 1 20210101 3 1 Offline 40
... ... ... ... ... ... ...
25 1 20210101 23 1 Offline 60
26 1 20210102 0 1 Offline 23
正如您在上面的資料中看到的,是每小時級別的,因此如果狀態分鐘列等于 60,那么該小時將只有一行。但是,如果不是,那么狀態分鐘將分布在加起來為 60 的行中,如您在第 2 行和第 3 行以及第 4 行和第 5 行中看到的那樣。
現在,我的目標是了解每個狀態持續多長時間,直到下一個狀態開始。因此上面示例的輸出將是:
site_id | date_id | location_id | status | status_minutes
1 20210101 1 Offline 117
1 20210101 1 Available 23
1 20210101 1 Offline 40
... ... ... ... ...
1 20210101 1 Offline 60
1 20210102 1 Offline 23
重要的部分是此操作應僅限于每天,如示例和輸出的最后兩行所示。因此求和僅在給定的一天內發生,然后從第二天的第 0 小時再次開始。
uj5u.com熱心網友回復:
這是一個缺口和孤島問題。該section_num正在使用找到的總前確定基團status_minutes。
您可以嘗試以下操作:
SELECT
site_id,
date_id,
location_id,
status,
SUM(status_minutes) as status_minutes
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY site_id,date_id,location_id
ORDER BY hour_id
) - ROW_NUMBER() OVER (
PARTITION BY site_id,date_id,location_id,status
ORDER BY hour_id
) as section_num
FROM
my_table
) t
GROUP BY
site_id,
date_id,
location_id,
status,
section_num
ORDER BY
site_id,
date_id,
location_id,
section_num
在 db fiddle 上查看作業演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/339054.html
標籤:sql sql-server
