2017-01-29 79 views
0

我有表比較i和i + 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'); 

我想要寫的查詢在哪裏可以找到在哪裏下一行>以前END_DATE的起始日期。他們必須是平等的。

我嘗試使用NUMBER_history作爲計數器來做類似的事情。 C-方式其中I由變量i組織週期和比較i和i + 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