일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- oracle
- 텐서플로우
- MSSQL PYTHON
- 오라클
- MSSQL
- rs485
- Visual Studio Code
- sql developer
- windows10
- rs422
- 장고
- vscode
- MX Component
- c#
- Serial
- 자본주의
- M2M
- PYTHON MSSQL
- Python
- matplot
- MEAN Stack
- scrapy
- 크롤링
- pymssql
- django
- 딥러닝
- tensorflow
- 티스토리 초대장
- 파이썬
- 윈도우10
Archives
- Today
- Total
안까먹을라고 쓰는 블로그
[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