2017-01-29 2 views
0

У меня есть таблицасравнить и + 1 элемент оракул

CREATE table table_x 
(
     id NUMBER, -- ID 
     NUMBER_history NUMBER, -- consecutive number 
     start_date date, -- start_date of next id=end_date of previous 
     end_date date -- should be >=start_date 
); 
INSERT INTO table_x VALUES (14 , 1, '13-NOV-92' ,'14-NOV-92'); 
INSERT INTO table_x VALUES (15 , 2, '14-NOV-92' ,'16-NOV-92'); 
INSERT INTO table_x VALUES (19 , 3, '16-NOV-92' ,'18-NOV-92'); 
INSERT INTO table_x VALUES (11 , 4, '18-NOV-92' ,'14-NOV-93'); 
INSERT INTO table_x VALUES (17 , 5, '15-NOV-93' ,'16-NOV-93'); 
INSERT INTO table_x VALUES (151 , 6, '16-NOV-93' ,'17-NOV-93'); 
INSERT INTO table_x VALUES (139 , 7, '17-NOV-93' ,'18-NOV-93'); 
INSERT INTO table_x VALUES (121 , 8, '19-NOV-93' ,'20-DEC-93'); 
INSERT INTO table_x VALUES (822 , 9, '20-DEC-93' ,'20-DEC-93'); 

Я хочу написать запрос, где я могу найти где start_date из следующего ряда> датой_окончания предыдущего. они должны быть равными.

Я пытаюсь сделать что-то подобное, используя NUMBER_history в качестве счетчика. С-путь, где я организовать цикл по переменной я и сравнить и + 1 (NUMBER_history и NUMBER_history + 1)

select * INTO row_tblx from table_x where NUMBER_history=NUMBER_history and end_date<(select start_date from table_x where NUMBER_history=NUMBER_history+1); 

но должен организовать цикл по n_counter от 1 до последнего значения NUMBER_history и выборки данных на несколько подряд , Как я могу это сделать?
Старается

set serveroutput on 
DECLARE 
CURSOR cur IS 
     SELECT * FROM table_x; 
TYPE row_tblx_type 
IS 
TABLE OF cur%ROWTYPE; 
row_tblx row_tblx_type; 

    rowx cur%ROWTYPE; 
    nh_count NUMBER; 
BEGIN 
FOR NUMBER_history IN cur LOOP 
select * INTO row_tblx from table_x where NUMBER_history=NUMBER_history and end_date<(select start_date from table_x where NUMBER_history=NUMBER_history+1); 
DBMS_OUTPUT.PUT_LINE (row_tblx(NUMBER_history).id); 
END LOOP; 
END; 
/

Как можно сделать это с помощью для или другого цикла, несколько записей или таблицы записей, курсора, в строке таблицы, как счетчик (NUMBER_history)? Как я могу сделать это без курсора?

+0

Обычно Я пытаюсь понять плохой английский (не все говорят по-английски). Тем не менее, что-то подобное не может быть освобождено бедным английским языком: «найдите, где дата начала ...> дата окончания **. Они должны быть равны **». Серьезно, можете ли вы, пожалуйста, проверить, что вы пишете, прежде чем публиковать его? Я перестала читать дальше этого момента. Вам повезло, что другие более прощающие, но в следующий раз вы, возможно, не повезете. – mathguy

ответ

2

Вам не нужно PL/SQL или петли для этого:

select * 
from (
    select id, number_history, start_date, end_date, 
      lead(start_date) over (order by number_history) as next_start 
    from table_x 
) t 
where next_start > end_date; 
+0

Отлично! Я чувствую, что есть аналитическая функция LEAD. Это лучшее решение. Но как я могу это сделать с PL/SQL, как будто свинец не существует? – ifooi

+0

Я попытался бы закончить свое собственное решение, потому что некоторые его функции могут быть полезны. – ifooi

+0

@ifooi Будьте точны с вашим вопросом. Является ли это проблемой, вызванной вызовом, так что вы хотите узнать PL/SQL? Или вы ищете другое решение, которое не использует LEAD/LAG? – BobC

1

Например, вот решение, которое не требует PL/SQL или функции LEAD/LAG

select a.*, b.* 
from table_x a 
join table_x b 
    on a.number_history+1 = b.number_history 
where b.start_date > a.end_date 
+0

Спасибо. Отлично. Самостоятельное соединение последовательным числом, – ifooi

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