메뉴 건너뛰기

Dev tips

http://blog.naver.com/hjc426/130037056133http://blog.naver.com/hhihealth/150017470627일별로 금액이 들어가 있는 테이블이 있습니다.

날짜              금액
2006/12/25     100,000
2006/12/26     200,000
2006/12/27     150,000
2006/12/28     250,000
2006/12/29     150,000
2006/12/30     170,000
2006/12/31     190,000
2007/01/01     150,000
2007/01/02     150,000
2007/01/03     140,000
2007/01/04     250,000
2007/01/05     350,000
.....

이 테이블의 1월 금액을 구하려고 합니다.(달력 형태로 표시할려고 합니다.)
단. 구하는 금액은 지정일의 + 3일의 금액을 구해야 합니다.

즉 1월1일칸에 표시 되는 금액은 (1일 + 2일 + 3일) 의 합계가 표시 되어야 합니다.
이렇게 31일까지 출력시키고 싶습니다.

해결 할 수 있는 힌트를 부탁드릴수 있을까요..


SELECT 날짜, 금액,
       SUM(금액) OVER(ORDER BY 날짜
                      RANGE BETWEEN INTERVAL '0' DAY PRECEDING
                                                   AND INTERVAL '2' DAY FOLLOWING) sum_3days
       FROM 테이블



---------------------------------------------------------------------------------
추가문제


테이블이 아래와 같습니다.

table : card_work

date       card_no   work_no   time     amt
============================================
20081010   084124    6321     234352   4000
20081011   123456    3422     101033   2000
20081011   483839    5322     101036   5000
20081011   123456    4333     101038   2000
20081012   483839    5322     024324   5000
20081012   483839    4256     024326   5000
20081012   483839    4256     024327   5000
20081012   334124    3211     021145   3890
20081012   334124    3743     054253   6000


(time 은 varchar2 시분초 로 되어있습니다)

위와 같은 테이블이 있을 때
같은 날짜(date)에 5초 이내(time) 에 처리된(두번이상 row가 생성된)
동일한 카드번호를 가지고 있는 데이터를 뽑아야합니다.


위와 같은 데이터 일때
date       card_no   work_no   time     amt
============================================
20081011   123456    3422     101033   2000
20081011   123456    4333     101038   2000
20081012   483839    5322     024324   5000
20081012   483839    4256     024326   5000
20081012   483839    4256     024327   5000

이런 로우만 출력.(같은 날짜, 같은 카드번호, 시간차이가 5초 이내)


SELECT *
FROM
(
SELECT t.*, COUNT(*) OVER(PARTITION BY card_no -- 같은 카드번호
        ORDER BY TO_DATE(dt||time,'yyyymmddhh24miss') -- 시간 기준
                RANGE        BETWEEN NUMTODSINTERVAL('5','second') PRECEDING                -- 5초전
                        AND NUMTODSINTERVAL('5','second') FOLLOWING                -- 5초후
        ) AS cnt
FROM t
)
WHERE cnt > 1 -- 갯수가 1이상이면 같은 카드번호에서 5초전~5초후 내용이 1개 이상 존재