2014-10-02 63 views
1

我正嘗試使用PL/SQL在結果集的不同行中查找開始和結束日期之間的差異。這裏有一個例子:PL/SQL在不同行中查找開始日期和結束日期之間的差異

ID TERM START_DATE END_DATE 

423 201420 26-AUG-13 13-DEC-13 

423 201430 21-JAN-14 09-MAY-14 

423 201440 16-JUN-14 07-AUG-14 

對於任何特定的ID,我要在第一時間拿到創紀錄的結束日期和第二記錄的開始日期之間的差異。同樣,我需要得到第二條記錄的結束日期和第三條記錄的開始日期之間的差異,等等。
最後,我將需要在各種ID上執行相同的操作。我假設我必須使用遊標和循環。

我將不勝感激任何幫助或建議。提前致謝。

+0

你或許可以在直SQL做到這一點,但你的問題不清楚。請顯示您期望的輸出內容。什麼是「第一」專欄?請成爲**具體**。 – OldProgrammer 2014-10-02 15:49:20

+0

你如何確定你想要的開始和結束日期? – Andrew 2014-10-02 15:49:23

+0

更重要的是,什麼決定了記錄的排序?我猜'TERM',但這需要證實。 – Raad 2014-10-02 15:52:47

回答

0

我會建議看一下使用Oracle的LEAD和LAG分析函數。聽起來它們應該適合你的需求。

在這裏看到的文檔:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions074.htm

+0

感謝您的建議和鏈接。將檢查LEAD和LAG分析函數,以瞭解我如何完成這項工作。 – rivrcatchr 2014-10-02 16:12:19

+0

猜我應該提供一個例子,根據rgettman的回答! :O – 2014-10-03 10:24:32

0

代碼:

SELECT [ID], [TERM], [START_DATE], [END_DATE], 
     CASE WHEN MIN([END_DATE]) OVER(PARTITION BY [ID] ORDER BY [TERM] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)=[END_DATE] THEN NULL ELSE 
     MIN([END_DATE]) OVER(PARTITION BY [ID] ORDER BY [TERM] ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)-[START_DATE] END AS [DAYS_BETWEEN] 
FROM [TABLE] 
5

"lead" analytic function in Oracle可以抓住從後續行的值作爲當前行中的值。

給定從查詢返回的一系列行和遊標的位置,LEAD提供對位於該位置之外的給定物理偏移處的行的訪問。

此處,此SQL從下一行抓取start_date,並從當前行中減去end_date

select id, term, start_date, end_date, 
     lead(start_date) over (partition by id order by term) - end_date diff_in_days 
from your_table; 

輸出示例:

 ID TERM  START_DATE   END_DATE    DIFF_IN_DAYS 
---------- ---------- -------------------- -------------------- ------------ 
     423 201420  26-AUG-2013 00:00:00 13-DEC-2013 00:00:00   39 
     423 201430  21-JAN-2014 00:00:00 09-MAY-2014 00:00:00   36 
     423 201440  14-JUN-2014 00:00:00 07-AUG-2014 00:00:00 
+0

我剛剛發佈了相同的內容......但是如果我正確理解了這個問題,我認爲你需要一個「PARTITION BY ID」。 – 2014-10-02 16:09:14

+0

@ WumpusQ.Wumbley你說得對。這個問題確實提到了「對於任何特定的ID」,所以我將通過ID添加一個分區。 – rgettman 2014-10-02 16:10:49

+0

感謝您的提示。我認爲這應該起作用,尤其是使用PARTITION BY。 – rivrcatchr 2014-10-02 16:14:22

0

這似乎工作:

SELECT DISTINCT ID, TERM_CODE, TERM_START_DATE, TERM_END_DATE, ((LEAD (TERM_START_DATE, 1) OVER (PARTITION BY ID ORDER BY TERM_CODE)) -TERM_END_DATE AS DIFF DAYS FROM TABLE

相關問題