2014-06-05 5 views
-1

나는 다음과 같은 형식의 데이터가 범위 :오라클 : 날짜에 회전식 데이터

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

오라클 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 

내가 라인을 따라 생각하고를 R = R + 1에 대한 하위 쿼리에 대한 조인과 함께 RANK OVER PARTITION을 사용한 다음 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