2012-08-27 10 views
0

我使用的Oracle 11g SQL開發..的Oracle SQL遊標FOR循環到START_DATE和END_DATE之間檢查,並指定一個跳閘值

我需要能夠循環通過一組日期, 檢查以查看是否高於或低於END_DATE是=或<或>比下一個END_DATE 並且其中START_DATE是不同..

然後分配一個行程數是作爲一個其=或 分配一個相同的新的旅行號碼,然後開始新的旅程,並再次檢查 下一個SET日期,看看它的=或<或>比c urrent日期..

我認爲,爲了做到這一點,我需要使用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 

在此先感謝您的幫助。 Alex

回答

1

根據您的數據,您只需枚舉日期對。你也可以用dense_rank()來做到這一點:

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

對於你的數據,這將改變順序。如果你想保持大致相同的排序,然後骨料第一,拿到分鐘行ID,並做了DENSE_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 
+0

感謝您與幫助代碼..它看起來像它的作品,但看着結果我有兩個其他列與它有衝突..這是我的sql
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 TABLE8 T ON B.START_DATE = T.START_DATE AND B.END_DATE = T.END_DATE; SeattleGray

+0

@SeattleGray。 。 。我想你只需要在列名之前使用別名:b.Cruise,b.Permit。 。 。 –