Notice
Recent Posts
Recent Comments
관리 메뉴

안까먹을라고 쓰는 블로그

[SQL Query] 구매이력에서 고객 별 (가장 최신이력 - 오래된 이력)의 구매가격(price)의 차이를 구하시오 본문

DataBase

[SQL Query] 구매이력에서 고객 별 (가장 최신이력 - 오래된 이력)의 구매가격(price)의 차이를 구하시오

YawnsDuzin 2022. 1. 7. 18:06

 

반응형

쿼리 조건
 - 고객 별 가장 최신이력 - 오래된 이력의 구매가격(price)의 차이를 구하시오
    ※ 순번이 작을 수록 오래된 구매이력 입니다.

Receipts 테이블 (구입명세)

cust_id (고객 ID) seq (순번) price (구입 가격)
A 1 500
A 2 1000
A 3 700
B 5 100
B 6 5000
B 7 300
B 9 200
B 12 1000
C 10 600
C 20 100
C 45 200
C 70 50
D 3 2000


쿼리
   ※ 윈도우함수를 이용한 쿼리가 가능 최적화된 쿼리
      테이블 스캔 빈도를 최대한 줄여서, I/O를 줄여서 성능을 높이자       

 - 윈도우 함수를 이용한 쿼리
 --------------------------------------------------------------
SELECT cust_id,
		SUM(CASE WHEN min_seq = 1 THEN price ELSE 0 END)
        - SUM(CASE WHEN max_seq = 1 THEN price ELSE 0 END) AS diff
FROM (SELECT cust_id, price,
		ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY seq) AS min_seq,
        ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY seq DESC) AS max_seq
        FROM Receipts) WORK
WHERE WORK.min_seq = 1
OR WORK.max_seq = 1
GROUP BY cust_id;

윈도우함수 사용 시, min_seq, max_seq 생성되는 부분

cust_id
(고객 ID)
seq
(순번)
price
(가격)
min_seq
(오름차순 순번)
max_seq
(내림차순 순번)
A 1 500 1 3
A 2 1000 2 2
A 3 700 3 1
B 5 100 1 5
B 6 5000 2 4
B 7 300 3 3
B 9 200 4 2
B 12 1000 5 1
C 10 600 1 4
C 20 100 2 3
C 45 200 3 2
C 70 50 4 1
D 3 2000 1 1

 

 - 일반 서브쿼리를 이용한 쿼리
 --------------------------------------------------------------
SELECT TMP_MIN.cust_id,
		TMP_MIN.price - TMP_MAX.price AS diff
FROM 
		(SELECT R1.cust_id, R1.seq, R1.price
		FROM RECEIPTS R1
        INNER JOIN
        (SELECT cust_id, MIN(seq) AS min_seq
        FROM Receipts
        GROUP BY cust_id) R2
        ON R1.cust_id = R2.cust_id
        AND R1.seq = R2.min_seq) TMP_MIN
        
        INNER JOIN
        
        (SELECT R3.cust_id, R3.seq, R3.price
		FROM RECEIPTS R3
        INNER JOIN
        (SELECT cust_id, MAX(seq) AS max_seq
        FROM Receipts
        GROUP BY cust_id) R4
        ON R3.cust_id = R4.cust_id
        AND R3.seq = R4.max_seq) TMP_MAX
        
        ON TMP_MIN.cust_id = TMP_MAX.cust_id


결과값

cust_id (고객 ID) diff
A -200
B -900
C 550
D 0

 

반응형

'DataBase' 카테고리의 다른 글

[SQL Query] Cursor  (0) 2022.01.07
[SQL Query] UNION, INTERSECT, EXCEPT (Feat. 집합연산)  (0) 2022.01.06
Comments