2014-06-05 46 views
-1

我有以下格式的數據:甲骨文:樞軸數據爲日期範圍

Date   Quantity 
----------------------- 
1-Jan-2014  5 
6-Jan-2014  15 
10-Jan-2014  67 
21-Jan-2014  42 

什麼的Oracle SQL我可以用它來生成結果:

StartDate  EndDate  Quantity 
---------------------------------- 
1-Jan-2014 5-Jan-2014 5 
6-Jan-2014 9-Jan-2014 15 
10-Jan-2014 20-Jan-2014 67 
21-Jan-2014 null   67 

我沿線思考使用RANK OVER PARTITION與針對R = R + 1的子查詢進行連接,然後對EndDate執行StartDate-1,但似乎無法使其工作。

+0

你的方法應該工作。向我們展示您的嘗試查詢。 – user2989408

回答

1

您可以使用LEAD函數獲取下一行並從中減去一行。

select date as startdate, 
     lead(date) over (order by date) - 1 as enddate, 
     quantity 
    from table; 

SQLFiddle

+1

**傳奇!**謝謝你教我新東西!一個非常優雅的解決方案 - 我真的很感謝在設置SQLFiddle的時候。 – user3383784

0

試試看看下面的查詢是否有效。

SELECT Left.Date "StartDate", 
    (right.Date - INTERVAL 1 DAY) "EndDate", 
    Left.Quantity 
FROM 
    (
     SELECT t1.Date, 
      t1.Quantity, 
      RANK() OVER (ORDER BY t1.DATE ASC) "rank" 
     FROM Table t1 
    ) as Left 
    LEFT OUTER JOIN 
    (
     SELECT t1.Date, 
      t1.Quantity, 
      RANK() OVER (ORDER BY t1.DATE ASC) "rank" 
     FROM Table t1 
    ) as Right ON Left.rank = Right.rank - 1 
+1

非常感謝 - 我最初的工作是正確的,但後來就像我即將接受您的答案一樣,我將其介紹給** LAG **功能。我想你必須贊同吃一隻桃子的** LAG **的優雅。 – user3383784