개발로 자기계발
728x90

ROW_NUMBER()

ROW_NUMBER()는 SQL에서 제공하는 윈도우 함수 중 하나이다. 이 함수는 결과 집합의 각 행에 고유한 숫자를 할당한다. 할당하는 숫자는 1부터 시작하며, 주로 정렬된 데이터에 순위를 부여하는 데 사용된다.

기본적으로 ROW_NUMBER() 함수는 OVER() 절과 함께 사용되며, OVER() 절 내부에서 ORDER BY를 통해 행에 할당되는 숫자의 순서를 결정한다.

예를 들어, 특정 테이블에서 가격(price)을 기준으로 상품에 순위를 부여하고 싶다면 다음과 같이 쿼리를 작성할 수 있다:

SELECT product_name, price, ROW_NUMBER() OVER (ORDER BY price DESC) AS rank
FROM products;

위 쿼리는 products 테이블의 각 상품에 대해 가격이 높은 순서대로 순위를 부여한다. 즉, 가장 비싼 상품이 1등이 되고, 그다음 비싼 상품이 2등이 되는 식이다.

단, ROW_NUMBER() 함수는 동일한 값을 가진 행에 대해서는 동일한 순위를 부여하지 않는다. 동일한 값이 여러 행에서 발견되더라도, 각 행은 고유한 순위를 가집니다. 이런 경우에는 RANK()나 DENSE_RANK() 함수를 사용하면 동일한 값을 가진 행에 동일한 순위를 부여할 수 있다


PARTITION BY {컬럼}: 전체 데이터를 특정 열의 각 유니크한 값에 따라 그룹화
ORDER BY {컬럼}: 각 그룹 내에서 랭킹을 매기는 기준을 정의
ON COMPLETION (not PRESERVE or PRESERVE): 이벤트를 실행시키고 삭제 or 계속해서 이벤트를 실행

 

RANK()

RANK() 함수는 윈도우 함수 중 하나로, 결과 집합의 각 행에 순위를 할당한다. 이 함수는 ROW_NUMBER() 함수와 비슷하지만, 동일한 값을 가진 행에 동일한 순위를 부여하는 점이 다르다. 즉, 동일한 값이 있는 행이 있을 경우에는 동일한 순위가 부여되며, 그다음 순위는 동일한 순위의 수만큼 건너뛴다.

아래는 RANK() 함수를 사용한 SQL 쿼리의 예이다:

SELECT product_name, price, RANK() OVER (ORDER BY price DESC) AS rank
FROM products;

위 쿼리는 products 테이블의 각 상품에 대해 가격이 높은 순서대로 순위를 부여한다. 여기서 가장 비싼 상품이 1등이 되고, 그다음 비싼 상품이 2등이 된다. 만약 동일한 가격을 가진 상품이 있으면 그 상품들에게 동일한 순위가 부여되고, 그 다음 순위는 동일한 순위의 수만큼 건너뛰게 된다. 예를 들어, 두 상품이 동일한 가격으로 1등이라면, 다음 상품은 3등이 된다.

 

DENSE_RANK()

DENSE_RANK() 함수 역시 윈도우 함수 중 하나로, 결과 집합의 각 행에 순위를 할당한다. 이 함수는 RANK() 함수와 비슷하지만, 동일한 값을 가진 행에 동일한 순위를 부여하는 점은 같지만, 그다음 순위를 부여할 때 순위의 수를 건너뛰지 않는 점이 다르다.

아래는 DENSE_RANK() 함수를 사용한 SQL 쿼리의 예이다:

SELECT product_name, price, DENSE_RANK() OVER (ORDER BY price DESC) AS rank
FROM products;

위 쿼리는 products 테이블의 각 상품에 대해 가격이 높은 순서대로 순위를 부여한다. 여기서 가장 비싼 상품이 1등이 되고, 그다음 비싼 상품이 2등이 된다. 만약 동일한 가격을 가진 상품이 있으면 그 상품들에게 동일한 순위가 부여되지만, 그다음 상품의 순위는 동일한 순위의 수에 상관없이 2등의 다음 순위인 3등이 된다. 즉, DENSE_RANK()는 RANK()와 달리 순위의 '구멍'이 없다.

728x90
SMALL

'Database & Data > MySQL' 카테고리의 다른 글

MySQL Bulk Insert(LOAD DATA INFILE)  (0) 2023.07.07
MySQL 기본 PATH 설정하기  (0) 2023.07.06
MySQL EVENT 간단 이해하기  (0) 2023.07.03
MySQL ON DUPLICATE KEY UPDATE 란?  (0) 2023.06.30
MySQL 파티셔닝(Partitioning)  (0) 2023.06.28
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)