>데이터 베이스 >MySQL 튜토리얼 >SQL RANK() 대 ROW_NUMBER(): 언제 각 함수를 사용해야 합니까?

SQL RANK() 대 ROW_NUMBER(): 언제 각 함수를 사용해야 합니까?

DDD
DDD원래의
2025-01-13 16:46:43915검색

SQL RANK() vs. ROW_NUMBER(): When Should You Use Each Function?

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별로 정렬할 때 처음 세 행이 중복됩니다. 각 함수가 이러한 중복 값을 처리하는 방법은 다음과 같습니다.

  • ROW_NUMBER()는 증가하는 값(1, 2, 3)을 할당하고 중복 값을 무시합니다.
  • RANK()는 세 개의 중복 행 모두에 동일한 순위 값(1)을 할당한 후 다음 다른 값에 대해 4로 점프합니다.
  • DENSE_RANK()도 중복 행에 동일한 순위 값(1)을 할당하지만 다음 다른 값에 대해서는 2로 증가합니다.

결론

RANK() 및 DENSE_RANK()는 중복된 값이 있는 경우에도 파티션 내에서 일관된 순위를 유지합니다. 하지만 ROW_NUMBER()는 임의로 증가하는 값을 할당하므로 예측할 수 없는 결과가 발생할 수 있습니다. 이러한 차이점을 이해하면 특정 SQL 요구 사항에 따라 적절한 함수를 선택하는 데 도움이 됩니다.

위 내용은 SQL RANK() 대 ROW_NUMBER(): 언제 각 함수를 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.