2014-11-05 3 views
2

내가 Y_을 적용 할 압연 기능을 수행하여 null 값을 채우려, PostgreSQL을

x y 
1 2 
2 null 
3 null 
1 null 
11 null 

, 같은 테이블의 모양이 {내가 + 1} = Y_ {I} + X_ 가능 (올바른 위치)만큼 간단 SQL

정도로 예상 결과

x y 
1 2 
2 4 
3 7 
1 8 
11 19 

와 I + {1}의 PostgreSQL 용구. 창 함수에서 캡슐화 할 수 있지만 사용자 정의 함수의 구현은 항상 복잡해 보입니다.

+0

당신이 무엇을하려고 않은 : 당신은 ID 열이없는,하지만 당신은 행을 주문하는 또 다른 방법이있는 경우, 당신은 ID를 얻을 수 row_number()를 사용할 수 있습니까? – Houari

+0

@Houari 래그 집계 함수를 사용하여 창 함수를 시도했지만 한 계산 만 열을 따라 계산을 전파 할 수 없습니다. –

+0

흠. 재귀 적으로 냄새가납니다. – wildplasser

답변

0

재귀 CTE를 사용하여 행을 반복 할 수 있습니다. 하지만 이렇게하려면 행에서 행으로 이동하는 방법이 필요합니다. 다음은 ID 열을 사용하는 예입니다.

; with recursive cte as 
     (
     select id 
     ,  y 
     from Table1 
     where id = 1 
     union all 
     select cur.id 
     ,  prev.y + cur.x 
     from Table1 cur 
     join cte prev 
     on  cur.id = prev.id + 1 
     ) 
select * 
from cte 
; 

SQL Fiddle에서 쿼리를 볼 수 있습니다. 여기

; with recursive sorted as 
     (
     -- Specify your ordering here. This example sorts by the dt column. 
     select row_number() over (order by dt) as id 
     ,  * 
     from Table1 
     ) 
,  cte as 
     (
     select id 
     ,  y 
     from sorted 
     where id = 1 
     union all 
     select cur.id 
     ,  prev.y + cur.x 
     from sorted cur 
     join cte prev 
     on  cur.id = prev.id + 1 
     ) 
select * 
from cte 
; 

SQL Fiddle link.

1
WITH RECURSIVE t AS (
    select x, y, 1 as rank from my_table where y is not null 
    UNION ALL 
    SELECT A.x, A.x+ t.y y , t.rank + 1 rank FROM t 
    inner join 
    (select row_number() over() rank, x, y from my_table) A 
    on t.rank+1 = A.rank 
) 
SELECT x,y FROM t; 
+0

+1 이것은 [잘 작동합니다] (http://sqlfiddle.com/#!12/818a0/5/0) 그러나 'over()'가 행의 순서를 어떻게 결정합니까? 예를 들어 'y is not null'이라는 행에 숫자 2로 레이블을 지정하지 않고 두 번 계산하고 다른 행을 생략 할 수 있습니까? – Andomar

+0

@Houari 감사합니다. –