> 데이터 베이스 > MySQL 튜토리얼 > SQL RANK()와 ROW_NUMBER(): 묶인 행을 처리할 때 어떻게 다릅니까?

SQL RANK()와 ROW_NUMBER(): 묶인 행을 처리할 때 어떻게 다릅니까?

Patricia Arquette
풀어 주다: 2025-01-13 17:01:42
원래의
823명이 탐색했습니다.

SQL RANK() vs. ROW_NUMBER(): How Do They Differ When Handling Tied Rows?

SQL RANK()와 ROW_NUMBER()의 차이점

SQL의 RANK() 함수와 ROW_NUMBER() 함수의 차이점은 종종 개발자를 혼란스럽게 합니다. 제공된 SQL 쿼리 문은 처음에는 동일한 결과를 생성하는 것처럼 보일 수 있지만 동일한 값이 있으면 다르게 실행됩니다.

차이점 살펴보기

RANK() 함수와 ROW_NUMBER() 함수의 주요 차이점은 동일한 값을 처리하는 방식입니다. RANK() 및 해당 DENSE_RANK() 함수는 결정적 동작을 나타냅니다. 여러 행이 분할 및 정렬 열에서 동일한 값을 갖는 경우 동일한 순위가 할당됩니다.

반대로 ROW_NUMBER()는 동일한 값의 행에 대해서도 결과값을 증가시켜 할당합니다. 이 동작은 비결정적입니다. 즉, 결과 집합에서 동일한 행의 순서가 임의로 변경될 수 있음을 의미합니다.

설명 예시

다음 시나리오를 고려해 보세요. 모든 행이 동일한 StyleID를 공유하여 파티션을 형성합니다. 이 파티션 내에서 ID를 기준으로 정렬하면 처음 세 행은 동일합니다.

<code class="language-sql">WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,2)
SELECT *,
    RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [RANK],
    ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS [ROW_NUMBER],
    DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [DENSE_RANK]
FROM T</code>
로그인 후 복사

결과 출력은 다음과 같습니다.

<code>StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
----------- -------- --------- --------------- ----------
1           1        1         1               1
1           1        1         2               1
1           1        1         3               1
1           2        4         4               2</code>
로그인 후 복사

보시다시피 ROW_NUMBER()는 동일한 행에 숫자 값을 점진적으로 할당하는 반면, RANK() 및 DENSE_RANK()는 동일한 세 행 모두에 동일한 순위를 할당합니다. DENSE_RANK()는 RANK()와 유사하게 동작하지만 순위 순서의 공백을 피하기 위해 다음 행에 다른 값 2를 할당합니다.

위 내용은 SQL RANK()와 ROW_NUMBER(): 묶인 행을 처리할 때 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿