데이터 분석/SQL

[쉽게 쓴 SQL] ROW_NUMBER, RANK, DENSE_RANK 차이

참치바나나 2020. 11. 6. 11:21

*dense : 빽빽한, 밀집한

세 개의 함수는 모두 순위를 매길 때 사용하지만, 조금씩의 차이가 있다. 예제 세팅 글

 

제품 가격이 낮은 순서로 순위를 매기고 싶다. 단, 같은 가격에도 순위 차이가 생기도록 한다. - ROW_NUMBER

SELECT 
	a.product_name
	,b.group_name
	,a.price
	,ROW_NUMBER () OVER
		(PARTITION BY b.group_name
		ORDER BY a.price)
FROM product a
INNER JOIN product_group b
	ON (a.group_id = b.group_id);

Postgresql에서는 같은 값을 가지는 ROW 중 ROW ID 가 높은 행이 우선 정렬된다 (desc 정렬에도 동일하다)

= SELECT * FROM product; 하면 'sony vaio'는 7행, 'lenovo thinkpad'는 6행

 

 

제품 가격이 낮은 순서로 순위를 매기고 싶다. 단, 같은 가격은 공동 순위로 하며, 공동 순위가 있는 만큼 다음 순위를 매기지 않는다. - RANK

SELECT 
	a.product_name
	,b.group_name
	,a.price
	,RANK () OVER
		(PARTITION BY b.group_name
		ORDER BY a.price)
FROM product a
INNER JOIN product_group b
	ON (a.group_id = b.group_id);

순위가 1,1,3위 인 것을 볼 수 있다

 

제품 가격이 낮은 순서로 순위를 매기고 싶다. 단, 같은 가격은 공동 순위로 하며, 공동 순위와 관계없이 순위를 매긴다. - DENSE_RANK

SELECT 
	a.product_name
	,b.group_name
	,a.price
	,dense_RANK () OVER
		(PARTITION BY b.group_name
		ORDER BY a.price)
FROM product a
INNER JOIN product_group b
	ON (a.group_id = b.group_id);

 

순위가 1,1,2위 인 것을 볼 수 있다

'데이터 분석 > SQL' 카테고리의 다른 글

[쉽게 쓴 SQL] LAG, LEAD 함수  (0) 2020.11.06
[쉽게 쓴 SQL] FIRST_VALUE, LAST_VALUE 함수  (0) 2020.11.06
[SQL 문법] AVG 함수  (0) 2020.11.05
[SQL 문법] 분석 함수  (0) 2020.11.05
[SQL 문법] CUBE () 절  (0) 2020.11.05