안녕하세요
급하다 보니 자주 문의드립니다. 먼저 감사하다는 말씀드립니다.
현재 데이터는 아래와 같습니다.
쿼리를 날렸을때
위와 같이 cum2 열을 나오게 하려면 어떻게 해야 될지요?
두번째 테이블 내용으로 보이는 뷰를 만들 것이 아니라,
cum 칼럼에 null 일 경우, 이전 값을 입력하는 방식으로 응용 프로그램을 바꾸는 것이,
이게 안되면, insert trigger를 하나 지정하는 것이 편할 것 같네요.
정렬에 관계없이 항상 row 에 대해 일정한 값을 가진다면 아무래도 데이타 입력시 값을 셋팅하는게 편할테고요
그렇지 않고 정렬에 따라 값이 변하게 된다면 아래와 같이 집계함수를 이용하면 되겠네요.
먼저 집계함수에 사용할 함수를 하나 만들고
CREATE OR REPLACE FUNCTION _cadd (integer, integer) RETURNS integer AS
$$
SELECT CASE WHEN $2 IS NULL THEN $1 ELSE $2 END;
$$ LANGUAGE SQL;
그리고 집계함수를 만들고
CREATE AGGREGATE csum (integer) (
SFUNC = _cadd,
STYPE = integer
);
그리고 이렇게 쿼리를 날리면 되겠지요
SELECT row, cum, csum(cum) OVER (ORDER BY row) AS cum2 FROM tab;
아, 들여쓰기가 안 되는가 봅니다.
아래와 같이 합 해보세요
원하는 답이 될런지 모르겠네요
WITH T AS ( SELECT '1' AS seq, NULL VAL UNION ALL SELECT '2', '30' UNION ALL SELECT '3', NULL UNION ALL SELECT '4', '20' UNION ALL SELECT '5', NULL UNION ALL SELECT '6', '40' UNION ALL SELECT '7', NULL UNION ALL SELECT '8', '30' UNION ALL SELECT '9', NULL )
SELECT seq, val, VAL2 FROM (SELECT seq, val, COALESCE(LAST_VALUE(val) OVER(ORDER BY seq ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),VAL) VAL2 FROM t ) a order by 1 ;