with TAB AS (
SELECT '2016-02-01' as "date" ,1001 AS "DB_ID", 100 AS "TOT_CNT", 50 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-02' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-03' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-04' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-05' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-06' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-07' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-08' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-09' as "date" ,1001 AS "DB_ID", 889 AS "TOT_CNT", 50 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-10' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-11' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-12' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-13' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-14' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-15' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-16' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-17' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-18' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-19' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL UNION ALL
SELECT '2016-02-20' as "date" ,1001 AS "DB_ID", 0 AS "TOT_CNT" ,0 AS "ERR_CNT" FROM DUAL
)
SELECT * FROM TAB
이라는 데이터가 있습니다.
date | DB_ID | TOT_CNT | ERR_CNT | |||
2016-02-01 | 1001 | 100 | 50 | |||
2016-02-02 | 1001 | 0 | 0 | |||
2016-02-03 | 1001 | 0 | 0 | |||
2016-02-04 | 1001 | 0 | 0 | |||
2016-02-05 | 1001 | 0 | 0 | |||
2016-02-06 | 1001 | 0 | 0 | |||
2016-02-07 | 1001 | 0 | 0 | |||
2016-02-08 | 1001 | 0 | 0 | |||
2016-02-09 | 1001 | 889 | 50 | |||
2016-02-10 | 1001 | 0 | 0 | |||
2016-02-11 | 1001 | 0 | 0 | |||
2016-02-12 | 1001 | 0 | 0 | |||
2016-02-13 | 1001 | 0 | 0 | |||
2016-02-14 | 1001 | 0 | 0 | |||
2016-02-15 | 1001 | 0 | 0 | |||
2016-02-16 | 1001 | 0 | 0 | |||
2016-02-17 | 1001 | 0 | 0 | |||
2016-02-18 | 1001 | 0 | 0 | |||
2016-02-19 | 1001 | 0 | 0 | |||
2016-02-20 | 1001 | 0 | 0 |
집합을 아래와 같이,
date | DB_ID | TOT_CNT | ERR_CNT | |||
2016-02-01 | 1001 | 100 | 50 | |||
2016-02-02 | 1001 | 100 | 0 | |||
2016-02-03 | 1001 | 100 | 0 | |||
2016-02-04 | 1001 | 100 | 0 | |||
2016-02-05 | 1001 | 100 | 0 | |||
2016-02-06 | 1001 | 100 | 0 | |||
2016-02-07 | 1001 | 100 | 0 | |||
2016-02-08 | 1001 | 100 | 0 | |||
2016-02-09 | 1001 | 889 | 50 | |||
2016-02-10 | 1001 | 889 | 0 | |||
2016-02-11 | 1001 | 889 | 0 | |||
2016-02-12 | 1001 | 889 | 0 | |||
2016-02-13 | 1001 | 889 | 0 | |||
2016-02-14 | 1001 | 889 | 0 | |||
2016-02-15 | 1001 | 889 | 0 | |||
2016-02-16 | 1001 | 889 | 0 | |||
2016-02-17 | 1001 | 889 | 0 | |||
2016-02-18 | 1001 | 889 | 0 | |||
2016-02-19 | 1001 | 889 | 0 | |||
2016-02-20 | 1001 | 889 | 0 |
이런 식으로 출력하고 싶습니다.
TOT_CNT가 0 값이면, 위에 값이 있는 데이터를 가져오고 싶은데
그루핑이나 파티션을 어떻게 해줘야할지 모르겠습니다.
(ex, 2016년 02월 1일은 100이었고 2일은 0이면 2일을 그 전날인 값인 100으로..)
출력결과에 대한 SQL 여쭤봅니다.
감사합니다.
-- PostgreSQL WITH tab AS ( SELECT '2016-02-01' "date", 1001 "DB_ID", 100 "TOT_CNT", 50 "ERR_CNT" UNION ALL SELECT '2016-02-02', 1001, 0, 0 UNION ALL SELECT '2016-02-03', 1001, 0, 0 UNION ALL SELECT '2016-02-04', 1001, 0, 0 UNION ALL SELECT '2016-02-05', 1001, 0, 0 UNION ALL SELECT '2016-02-06', 1001, 0, 0 UNION ALL SELECT '2016-02-07', 1001, 0, 0 UNION ALL SELECT '2016-02-08', 1001, 0, 0 UNION ALL SELECT '2016-02-09', 1001, 889, 50 UNION ALL SELECT '2016-02-10', 1001, 0, 0 UNION ALL SELECT '2016-02-11', 1001, 0, 0 UNION ALL SELECT '2016-02-12', 1001, 0, 0 UNION ALL SELECT '2016-02-13', 1001, 0, 0 UNION ALL SELECT '2016-02-14', 1001, 0, 0 UNION ALL SELECT '2016-02-15', 1001, 0, 0 UNION ALL SELECT '2016-02-16', 1001, 0, 0 UNION ALL SELECT '2016-02-17', 1001, 0, 0 UNION ALL SELECT '2016-02-18', 1001, 0, 0 UNION ALL SELECT '2016-02-19', 1001, 0, 0 UNION ALL SELECT '2016-02-20', 1001, 0, 0 ) SELECT DATE , "DB_ID" , (SELECT "TOT_CNT" FROM tab b WHERE "DB_ID" = a."DB_ID" AND "date" <= a."date" AND "TOT_CNT" > 0 ORDER BY "date" DESC LIMIT 1 ) TOT_CNT , "ERR_CNT" FROM tab a ;