對于按值列相同的記錄,我需要以秒為單位求和延遲時間。問題是我只需要將它們按相同的塊分組而不是全部分組。例如,對于下面的資料,我需要對值 3 的 3 條記錄求和,對進一步向下的 2 條記錄分別求和,而不是對值 4 的記錄求和,因為它們不在一起。有沒有辦法做到這一點?
ID 值時間戳延遲 166549627 4 19-10-21 11:00:19 11.4 166549450 8 19-OCT-21 11:00:27 7.5 166549446 3 19-OCT-21 11:00:34 7.1 166549625 3 19-OCT-21 11:00:45 10.9 166549631 3 19-OCT-21 11:00:58 13.3 166550549 3 19-OCT-21 11:01:03 4.5 166549618 7 19-OCT-21 11:01:14 8.8 166549627 4 19-10-21 11:01:23 11.4 166550549 3 19-OCT-21 11:01:45 4.5 166550549 3 19-OCT-21 11:01:59 4.5
uj5u.com熱心網友回復:
如果您想使用 PL/SQL,您可以遍歷所有按時間戳排序的記錄。
只要記住最后一個值并總結它是否與當前值相同。如果沒有,只需將總和保存在其他地方并繼續。
您還可以將其撰寫為流水線函式,以使用查詢訪問資料。
宣布
l_sum 數:= 0;
l_last_val 編號;
開始
for rec in (select * from your_table order by timestamp) 回圈
如果 l_last_val = rec.value 那么
l_sum := l_sum rec.delay;
繼續;
elsif l_last_val 不為空然后
dbms_output.put_line('value: ' || l_last_val || ' sum: ' || l_sum); -- 保存 last_val 和 sum
萬一;
l_last_val := rec.val;
l_sum := rec.delay;
結束回圈;
dbms_output.put_line('value: ' || l_last_val || ' sum: ' || l_sum); -- 保存 last_val 和 sum
結尾;
uj5u.com熱心網友回復:
您甚至不需要為此使用 plsql。只有 SQL 就足夠了。下面的解決方案使用遞回公用表運算式(CTE) 技術根據值列和時間戳列創建子組。
with ranked_rows (ID, VALUE, TIMESTAMP, DELAY, RNB) as (
select ID, VALUE, TIMESTAMP, DELAY, row_number()over(order by TIMESTAMP) rnb
from YourTable
)
, cte (ID, VALUE, TIMESTAMP, DELAY, RNB, grp) as (
select ID, VALUE, TIMESTAMP, DELAY, RNB, 1 grp
from ranked_rows
where rnb = 1
union all
select t.ID, t.VALUE, t.TIMESTAMP, t.DELAY, t.RNB, case when c.VALUE = t.VALUE then c.grp else c.grp 1 end
from ranked_rows t
join cte c on c.rnb 1 = t.rnb
)
select VALUE, sum(DELAY) sum_consecutive_DELAY, min(TIMESTAMP) min_TIMESTAMP, max(TIMESTAMP) max_TIMESTAMP, count(*)nb_rows
from cte
group by VALUE, GRP
order by min_TIMESTAMP
;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327529.html
上一篇:在oracle表中自動更改狀態
