Oracle SQL -仅按附近相同的记录分组



我需要对按值列相同的记录以秒为单位求和延迟时间。问题是我只需要它们按相同的块分组,而不是全部放在一起。例如,对于下面的数据,我需要值3的3条记录和单独的2条记录,而不是值4的记录求和,因为它们不在一起。有办法做到这一点吗?

ID Value时间戳延迟(s)166549627 4 19-oct-21 11:00:19 11.4166549450 8 19-oct-21 11:00:27 7.5166549446 3 19-oct-21 11:00:34 7.1166549625 3 19-oct-21 11:00:45 10.9166549631 3 19-oct-21 11:00:58 13.3166550549 3 19-oct-21 11:01:03 4.5166549618 7 19-oct-21 11:01:14 8.8166549627 4 19-oct-21 11:01:23 11.4166550549 3 19-oct-21 11:01:45 4.5166550549 3 19-OCT-21 11:01:59 4.5

您甚至不需要为此目的使用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
;

演示

如果你想使用PL/SQL,你可以循环遍历所有记录,按时间戳排序。

只要记住最后一个值并求和,如果它与当前值相同。如果没有,就把总和保存到其他地方,然后继续。

你也可以把它写成一个流水线函数来使用查询来访问数据。

<>之前宣布L_sum number:= 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;继续;如果l_last_val不为空dbms_output。put_line('值:' | | l_last_val | |"和:"| | l_sum);——保存last_val和sum如果;L_last_val:= recs .val;L_sum:= rec.delay;结束循环;dbms_output。put_line('值:' | | l_last_val | |"和:"| | l_sum);——保存last_val和sum结束;

最新更新