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 중국어 웹사이트의 기타 관련 기사를 참조하세요!