oracle sql group by 时间变化 valid 从 valid 到
oracle sql group by change in time valid from valid to
我有以下关于工单状态随时间变化的历史数据,我感兴趣的是使用 VALFROM-VALTO 获得结果
源数据
ticket_ID, change-time , queue
--------------------------------------
001 , 2018-01-01 00:00:00, queue1
001 , 2018-01-01 00:01:00, queue1
001 , 2018-01-01 00:03:00, queue2
001 , 2018-01-01 00:04:00, queue1
001 , 2018-01-01 00:05:00, queue3
目标数据
ticket_ID, valfrom , valto , queue
-----------------------------------------------------------
001 , 2018-01-01 00:00:00, 2018-01-01 00:02:59, queue1
001 , 2018-01-01 00:03:00, 2018-01-01 00:03:59, queue2
001 , 2018-01-01 00:04:00, 2018-01-01 00:04:59, queue1
001 , 2018-01-01 00:05:00, 2999-12-31 23:59:59, queue3
我认为这可以使用带有 OVER 的 ROW_NUMBER 函数来完成。
任何有用的建议都非常受欢迎。
使用不同的行号方法将行分类(基于连续队列值相同),lead
从下一行获取值。此后,它是一个group by
操作来获取从和到时间。
select ticketid,queue,min(change_time),
coalesce(max(next_change_time)-interval '1' second,timestamp '2999-12-31 23:59:59')
from (select t.*,row_number() over(partition by ticketid order by change_time)
-row_number() over(partition by ticketid,queue order by change_time) as grp,
lead(change_time) over(partition by ticketid order by changetime) as next_change_time
from tbl t
) t
group by ticketid,queue,grp
你可以通过多种方式做到这一点,这里我使用 lag()
来消除行,其中前一个 change_time
与当前相同,并使用 lead()
将下一个值显示为 valto
:
select id, queue, ct valfrom,
nvl(lead(ct) over (order by ct) - interval '1' second,
date '3000-01-01' - interval '1' second) valto
from (select id, ct, queue, lag(queue) over (order by ct) lq from source)
where lq is null or lq <> queue
我有以下关于工单状态随时间变化的历史数据,我感兴趣的是使用 VALFROM-VALTO 获得结果
源数据
ticket_ID, change-time , queue
--------------------------------------
001 , 2018-01-01 00:00:00, queue1
001 , 2018-01-01 00:01:00, queue1
001 , 2018-01-01 00:03:00, queue2
001 , 2018-01-01 00:04:00, queue1
001 , 2018-01-01 00:05:00, queue3
目标数据
ticket_ID, valfrom , valto , queue
-----------------------------------------------------------
001 , 2018-01-01 00:00:00, 2018-01-01 00:02:59, queue1
001 , 2018-01-01 00:03:00, 2018-01-01 00:03:59, queue2
001 , 2018-01-01 00:04:00, 2018-01-01 00:04:59, queue1
001 , 2018-01-01 00:05:00, 2999-12-31 23:59:59, queue3
我认为这可以使用带有 OVER 的 ROW_NUMBER 函数来完成。 任何有用的建议都非常受欢迎。
使用不同的行号方法将行分类(基于连续队列值相同),lead
从下一行获取值。此后,它是一个group by
操作来获取从和到时间。
select ticketid,queue,min(change_time),
coalesce(max(next_change_time)-interval '1' second,timestamp '2999-12-31 23:59:59')
from (select t.*,row_number() over(partition by ticketid order by change_time)
-row_number() over(partition by ticketid,queue order by change_time) as grp,
lead(change_time) over(partition by ticketid order by changetime) as next_change_time
from tbl t
) t
group by ticketid,queue,grp
你可以通过多种方式做到这一点,这里我使用 lag()
来消除行,其中前一个 change_time
与当前相同,并使用 lead()
将下一个值显示为 valto
:
select id, queue, ct valfrom,
nvl(lead(ct) over (order by ct) - interval '1' second,
date '3000-01-01' - interval '1' second) valto
from (select id, ct, queue, lag(queue) over (order by ct) lq from source)
where lq is null or lq <> queue