반응형

 

-- 사용 테이블 예제
CREATE TABLE product_order(
	ID   INT AUTO_INCREMENT PRIMARY KEY,
	NAME VARCHAR(20),
	product VARCHAR(50),
	price INT
);


INSERT INTO product_order(name, product, price) VALUES('홍길동', 'TV', 5000);
INSERT INTO product_order(name, product, price) VALUES('홍길순', '핸드폰', 10000);
INSERT INTO product_order(name, product, price) VALUES('김민지', '핸드폰', 10000);
INSERT INTO product_order(name, product, price) VALUES('김민수', '컴퓨터', 2000);
INSERT INTO product_order(name, product, price) VALUES('이민지', '생수', 500);

📝윈도우 함수

행과 행 사이 관계를 쉽게 정의하기 위해 만든 MySQL에서 제공하는 함수로 OVER절이 들어간 함수입니다.

말이 좀 어려울 수 있는데 간단하게 MAX, MIN처럼 최대값 또는 최소값을 구하기 쉽게 제공하는 것과 같은 거입니다.

예시를 보시면 이해하기 쉬울 겁니다.

 

📝ROW_NUMBER

OVER에는 일반적으로 어떤 기준으로 할지에 대한 정렬 방식이 있습니다.

예를 들면 ORDER BY price DESC의 경우 지출 금액 내림차순으로 정렬되어있습니다. 그 기준으로 ROW_NUMBER(순위를 매기겠다)라는 의미입니다.

 

하기와 같이 지출 순위를 붙여서 만드려면 복잡하게 만들어야하는데 이걸 편하게 도와줍니다.

SELECT ROW_NUMBER() OVER(ORDER BY price DESC) "지출 순위", name, price FROM product_order;

 

Document
지출 순위 name price
1 김민지 10000
2 홍길순 10000
3 홍길동 5000
4 김민수 2000
5 이민지 500

 

📝DENSE_RANK

DENSE_RANK같은 경우는 만약 비교값이 동일할 경우 공동순위로 올려줍니다.

하기에서는 김민지와 홍길순의 지출액이 같지만 김민지가 먼저 나오게 됩니다.

SELECT DENSE_RANK() OVER(ORDER BY price DESC) "지출 순위", name, price FROM product_order;

 

Document
지출 순위 name price
1 김민지 10000
1 홍길순 10000
2 홍길동 5000
3 김민수 2000
4 이민지 500

 

 

📝RANK

RANK의 경우 홍길동이 3위가 아닌 2위로 나오게 됩니다 만약 3위로 나오게 하고 싶으면 RANK 함수를 이용하면 됩니다.

 

SELECT RANK() OVER(ORDER BY price DESC) "지출 순위", name, price FROM product_order;

 

Document
지출 순위 name price
1 김민지 10000
1 홍길순 10000
3 홍길동 5000
4 김민수 2000
5 이민지 500
반응형