집 >데이터 베이스 >MySQL 튜토리얼 >SQL RANK() 대 ROW_NUMBER(): 언제 각 함수를 사용해야 합니까?
SQL의 RANK() 및 ROW_NUMBER() 함수에 대한 심층적인 이해
SQL의 RANK() 및 ROW_NUMBER() 함수는 혼동되는 경우가 많으며, 이 문서에서는 둘 사이의 차이점을 명확하게 설명하는 것을 목표로 합니다.
우선 파티션에 중복된 값이 없다면 이 두 함수의 SQL 쿼리 결과는 완전히 동일할 것이라는 점에 유의해야 합니다. 그러나 중복된 값이 나타나면 차이가 확연해집니다.
중복된 가치와 확실성
ROW_NUMBER() 함수는 행의 정렬 열 값이 동일하더라도 파티션 내의 각 행에 고유한 증분 값을 할당합니다. 이는 ROW_NUMBER()가 비결정적이며 할당된 값이 각 쿼리에서 임의로 변경될 수 있음을 의미합니다.
반대로 RANK()와 DENSE_RANK()는 모두 파티션 내에서 결정적입니다. 정렬 열과 분할 열 모두에서 동일한 값을 갖는 경우 여러 행에 동일한 순위 값이 할당됩니다.
예
다음 예를 고려해 보세요.
<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>
이 예에서는 동일한 파티션(StyleID) 내에서 ID별로 정렬할 때 처음 세 행이 중복됩니다. 각 함수가 이러한 중복 값을 처리하는 방법은 다음과 같습니다.
결론
RANK() 및 DENSE_RANK()는 중복된 값이 있는 경우에도 파티션 내에서 일관된 순위를 유지합니다. 하지만 ROW_NUMBER()는 임의로 증가하는 값을 할당하므로 예측할 수 없는 결과가 발생할 수 있습니다. 이러한 차이점을 이해하면 특정 SQL 요구 사항에 따라 적절한 함수를 선택하는 데 도움이 됩니다.
위 내용은 SQL RANK() 대 ROW_NUMBER(): 언제 각 함수를 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!