Курсор Oracle SQL для цикла для проверки между START_DATE и END_DATE и присвоения значения отключения

Я использую SQL Developer для Oracle 11g.

Мне нужно иметь возможность перебрать набор дат, проверить, является ли END_DATE выше или ниже = или ‹ или > чем следующая END_DATE И где START_DATE отличается..

Затем назначьте номер поездки, который совпадает с номером, которому он =, или назначьте новый номер поездки, а затем начните новую поездку и снова проверьте следующий НАБОР дат, чтобы увидеть, = или ‹ или >, чем текущая дата..

Я думаю, что для этого мне нужно использовать курсор pl/sql для цикла. Я пытался понять это, но для меня это не имеет особого смысла.

Например, я хочу, чтобы конечный результат был примерно таким.

ROWID   START_DATE END_DATE   TRIP
  1         30-DEC-11  1-Jan-12 1
  2         31-DEC-11  2-Jan-12 2
  3         31-DEC-11  2-Jan-12 2
  4         01-JAN-12  3-Jan-12 3
  5         03-JAN-12  4-Jan-12 4
  6         01-JAN-12  1-Jan-12 5
  7         02-JAN-12  4-Jan-12 6

Заранее спасибо за вашу помощь. Алекс


person SeattleGray    schedule 27.08.2012    source источник


Ответы (1)


Основываясь на имеющихся у вас данных, вы просто хотите перечислить пары дат. Вы также можете сделать это с помощью плотности_rank():

select t.*,
       dense_rank() over (order by start_date, end_date) as trip
from t

Для ваших данных это изменит порядок. Если вы хотите сохранить примерно тот же порядок, то сначала выполните агрегирование, получите минимальный идентификатор строки, выполните функцию плотности_rank() или row_number() и соедините исходные данные:

select t.*, trip
from (select start_date, end_date, row_number() over (partition by row_id) as trip
      from (select start_date, end_date, min(rowid) as rowid
            from t
            group by start_date, end_date
           ) a
     ) b join
     t
     on b.start_date = t.start_date and b.end_date = t.end_date
person Gordon Linoff    schedule 27.08.2012
comment
Спасибо за помощь с кодом.. похоже, он работает, но, глядя на результаты, у меня есть два других столбца, которые конфликтуют с ним.. вот мой код sql ‹/br›‹‹SELECT CRUISE, PERMIT, START_DATE, END_DATE, TRIP AS FROM (SELECT START_DATE, END_DATE, ROW_NUMBER() OVER (PARTITION BY ROWID ORDER BY END_DATE) AS TRIP FROM (SELECT START_DATE, END_DATE, MIN(ROWID) AS ROWID FROM T group by START_DATE, END_DATE ) a ) B JOIN ТАБЛИЦА 8 T ON B.START_DATE = T.START_DATE AND B.END_DATE = T.END_DATE;‹/code› - person SeattleGray; 27.08.2012
comment
@СиэтлГрей. . . Я думаю, вам просто нужно использовать псевдонимы перед именем столбца: b.Cruise, b.Permit. . . - person Gordon Linoff; 27.08.2012