2016-02-03 5 views
0

Я столкнулся с блокпостом, который кажется простым исправлением, но я не могу найти решение. Я надеюсь, что некоторые люди здесь с немного больше знаний в Oracle SQL могут помочь.Перезапустить последовательность строк Row_Number при выполнении условия

По существу, я строю список вакансий, занимаемый полной датой, что достаточно просто. Общая связь между ними заключается в том, что они все для одного и того же клиента (отдельный номер) и в том же месте (отдельный номер). Моя проблема в том, что мне нужно найти способ прервать и перезапустить этот рейтинг/счет от 1 каждый раз, когда продолжительность между двумя заданиями превышает 30 дней. Вот упрощенная версия того, что я смотрю на:

JOBCOUNT ACCTNUM LOCNUM  COMPDATE   DURATION 
-------- ------- ------  --------   -------- 
    2  001  003  8/21/2015 16:47  15.48763889   
    3  001  003  10/5/2015 11:31  41.98304398   
    4  001  003  10/19/2015 9:59  13.21804398   
    5  001  003  11/13/2015 15:23 24.43752315   
    6  001  003  11/30/2015 19:19 11.35537037   

Как я хотел бы видеть его, в связи с длительностью более 30 на второй линии, заключается в следующем:

JOBCOUNT ACCTNUM LOCNUM  COMPDATE   DURATION 
-------- ------- ------  --------   -------- 
    2  001  003  8/21/2015 16:47  15.48763889   
    1  001  003  10/5/2015 11:31  41.98304398   
    2  001  003  10/19/2015 9:59  13.21804398   
    3  001  003  11/13/2015 15:23 24.43752315   
    4  001  003  11/30/2015 19:19 11.35537037 

Поскольку второе задание выходит за пределы 30-дневного окна, цепочка должна начинаться с одного со следующей работой. Моя проблема заключается в том, что я не могу найти способ разбить данные таким образом, чтобы этот критерий был распознан и также начинался над подсчетом. Нет другого столбца, который бы позволил мне разбивать row_number или dense_rank таким образом (например, общий ключ заказа или системная последовательность заданий для каждой 30-дневной цепочки).

Я пробовал около 20 различных способов проанализировать эти данные из тем, которые я читал здесь, безрезультатно, поэтому любая помощь или идеи о том, как это можно реализовать, будет оценена огромным образом. У меня около 50 000 строк данных, к которым необходимо применить эту последовательность. Я преподаю сам SQL примерно год спустя на лету и на работе. Я ударил свой лимит знаний по этому.

+0

Зачем вам начинать с 2, а не 1? –

ответ

0

В принципе, вам нужна дополнительная группировка. Вы можете вычислить группировку, делая накопленную сумму на флаге вычисленного разницей, больше чем 30. Тогда все остальное кажется, row_number():

select t.*, 
     row_number() over (partition by acctnum, locnum, grp order by compdate) as jobcount 
from (select t.*, 
      sum(case when duration > 30 then 1 else 0 end) over 
       (partition by acctnum, locnum order by compdate) as grp 
     from t 
    ) t; 

Однако ваши данные выборки начинается с 2, а не 1, которые я не совсем понимаю.

+0

Спасибо, я буду реализовывать и обновлять. Образец начинается с 2, потому что исходное задание исключается ранее в запросе из-за того, что оно не является необходимым в распределяемом выходе (у меня есть некоторые столбцы, объединенные в конце моего исходного потока данных, которые добавляют в предыдущую информацию о задании для ссылка, поэтому первое задание будет избыточным). При необходимости он может быть повторно включен и исключен позже. –

+0

Работал очарование. Спасибо, Гордон. –

Смежные вопросы