оракул sql группа по изменению времени действует с действительного на - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующие исторические данные об изменениях статуса билетов с течением времени, меня интересует получение результатов с 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

Я думаю, что это можно сделать с помощью функции ROW_NUMBER с OVER.Любые полезные советы приветствуются.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете сделать это различными способами, здесь я использовал lag() для исключения строк, где предыдущий change_time совпадает с текущим, и использовал lead(), чтобы показать следующее значение как valto:

Демонстрация SQLFiddle

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
0 голосов
/ 21 сентября 2018

Используйте подход с разницей номеров строк, чтобы классифицировать строки по группам (основываясь на одинаковых последовательных значениях очереди), 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
...