这是输入和所需输出的示例,我认为这比我描述需求更容易理解。
名字 | 开始 | 结束 | 差异 | 正在进行的_序列 |
---|---|---|---|---|
测试1 | 2024-04-21 00:00:21 | 2024-04-21 00:01:21 | 00:01:00 | 1 |
测试1 | 2024-04-21 00:01:21 | 2024-04-21 00:02:21 | 00:01:00 | 1 |
测试1 | 2024-04-21 00:02:21 | 2024-04-21 00:03:21 | 00:01:00 | 1 |
测试1 | 2024-04-21 00:03:21 | 2024-04-21 00:15:21 | 00:00:00 | 0 |
测试1 | 2024-04-21 00:15:21 | 2024-04-21 00:16:21 | 00:01:00 | 1 |
测试1 | 2024-04-21 00:16:21 | 2024-04-21 00:17:21 | 00:01:00 | 1 |
测试1 | 2024-04-21 00:17:21 | 2024-04-21 00:23:21 | 00:00:00 | 0 |
测试2 | 2024-04-22 00:00:21 | 2024-04-22 00:01:21 | 00:01:00 | 1 |
测试2 | 2024-04-22 00:01:21 | 2024-04-22 00:02:21 | 00:01:00 | 1 |
名字 | 分钟开始时间 | 最大结束 | 差异 |
---|---|---|---|
测试1 | 2024-04-21 00:00:21 | 2024-04-21 00:03:21 | 00:03:00 |
测试1 | 2024-04-21 00:15:21 | 2024-04-21 00:17:21 | 00:02:00 |
测试2 | 2024-04-22 00:00:21 | 2024-04-22 00:02:21 | 00:02:00 |
您能给我一些关于如何直接在 SQL 中以高性能方式实现它的建议吗?迭代结果并以这种方式创建输出不是一种选择。
提前致谢!
存在类似的帖子,例如按时间段分组,但这不会产生预期的结果。
count()over window1
。 db<>fiddle 的演示:
select name
,min("start") as max_start
,max("end") as max_end
,sum(difference) as difference
from(select *,count(*)filter(where ongoing_sequence=0)over(w1) as seq_no
from test
window w1 as (partition by name order by "start"))_
where ongoing_sequence<>0
group by name,seq_no;
名字 | 最大开始时间 | 最大结束 | 差异 |
---|---|---|---|
测试1 | 2024-04-21 00:00:21 | 2024-04-21 00:03:21 | 00:03:00 |
测试2 | 2024-04-22 00:00:21 | 2024-04-22 00:02:21 | 00:02:00 |
测试1 | 2024-04-21 00:15:21 | 2024-04-21 00:17:21 | 00:02:00 |
order by "start"
意味着range between unbounded preceding and current row
,这意味着每一行都会回顾并计算到目前为止有多少个间隙。每个不间断的行序列将共享该计数 - 如果存在间隙,则会递增。group by "name"
。