2017-11-09 8 views
0

저는 둘러 보았고 LAG()와 총 유형 쿼리를 사용하여 몇 가지 게시물을 찾았습니다. 그러나 내가 찾고있는 것이 맞지 않는 것 같습니다. 어쩌면 나는 나의 수색에있는 정확한 기간을 사용하고 있지 않다 또는 어쩌면 나는 상황을 복잡하게하기지도 모르다. 누군가 나를 도울 수 있기를 바랍니다.이전 행을 수정하여 목록의 SQL 쿼리에서 현재 행에 사용할 수 있습니까?

하지만 내가하고 싶은 것은 이전 결과를 취해서 현재 행에 여러 날짜 범위로 배정하는 것입니다. 시작은 항상 기본 번호입니다. 간단하게 유지하려면 10 번을 사용하십시오. 그 값들은 플로트가 될 것이지만, 나는 여기에 숫자를 말끔히 써서 나의 질문을 더 잘 설명해 주었다.

첫 번째는 계산 부분을 표시하고 두 번째 테이블은 결과가 마지막에 어떻게 나타나는지 보여줍니다.

date  val1 calc_result 
20120930 null 10 
20121031 2 10*2=20 
20121130 3 20*3=60 
20121231 1 60*1=60 
20130131 2 60*2=120 
20130228 1 120*1=120 

쿼리 내가이 쿼리 유형의 솔루션으로 수행 할 수 있는지 확인하기 위해 노력하고있어/또는 커서가 필요 PL/SQL 테이블을 사용하는 것입니다

20120930 10 
20121031 20 
20121130 60 
20121231 60 
20130131 120 
20130228 120 

반환?

도움을 주시면 감사하겠습니다.

+0

무엇을 시도 했습니까? SO는 무료 코딩 서비스가 아닙니다. 쿼리를 게시합니다. 올바른 결과를 얻지 못하면 잘못된 점을 설명하고 예상되는 결과는 무엇인지 설명하십시오. 그럼 우리가 도울 수있어. – Eric

답변

1

당신은 재귀 CTE하여이 작업을 수행 할 수 있습니다 :이 누적 제품을 계산하는

with dates as (
     select t.*, row_number() over (order by date) as seqnum 
     from t 
    ), 
    cte as (
     select t.date, t.val, 10 as calc_result 
     from dates t 
     where t.seqnum = 1 
     union all 
     select t.date, t.val, cte.calc_result * t.val 
     from cte join 
      dates t 
      on t.seqnum = cte.seqnum + 1 
    ) 
select cte.date, cte.calc_result 
from cte 
order by cte.date; 
+0

좋아, 나는 이걸 가지고 놀았고 작동하는 것 같다. CTE가이 [링크] (http://www.dba-oracle.com/t_common_table_expression_cte.htm)를 통해 CTE를 읽어야했기 때문에 계속 수정하고 알려 드리겠습니다. – user2025696

1

. 몇 가지 지수 산술을 사용하면됩니다. 쿼리의 10을 원하는 시작 값으로 바꿉니다.

select date,val1 
,case when row_number() over(order by date) = 1 then 10 --set start value for first row 
else 10*exp(sum(ln(val1)) over(order by date)) end as res 
from tbl 
+0

이것은 가깝지만 첫 번째 행이 또한 곱 해져서 나머지 숫자가 꺼지는 것으로 보입니다. 따라서 첫 번째 행은 항상 10 또는 숫자로 설정해야하며 두 번째 행은 10 * 2 인 prev_row * curr_row가됩니다. 입력 한 샘플에는 10이 표시되지만 두 번째 행에는 10을 곱하지 않고 10 * curr_row의 곱으로 표시합니다. – user2025696