>데이터 베이스 >MySQL 튜토리얼 >단일 SQL 테이블에서 그룹당 최대값을 효율적으로 검색하려면 어떻게 해야 합니까?

단일 SQL 테이블에서 그룹당 최대값을 효율적으로 검색하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-21 07:56:14872검색

How Can I Efficiently Retrieve the Maximum Value per Group in a Single SQL Table?

그룹별 최대 값 검색을 위한 SQL 쿼리 최적화

대규모 SQL 테이블을 작업할 때는 효율적인 데이터 검색이 무엇보다 중요합니다. 자주 수행되는 작업에는 특정 행 그룹 내의 최대값을 식별하는 작업이 포함됩니다. 이 문서에서는 여러 테이블 스캔을 피하면서 이를 효율적으로 달성하기 위한 최적화된 SQL 쿼리를 보여줍니다.

SCORES, IDROUND 열이 있는 SCORE 테이블을 생각해 보겠습니다. 목표는 각 ROUND 및 해당 ID에 대해 최대 SCORE를 얻는 것입니다. 반복 처리를 포함하는 비효율적인 방법은 대규모 데이터세트에 적합하지 않습니다.

다음 쿼리는 최적의 성능을 위해 창 기능과 DISTINCT을 사용합니다.

<code class="language-sql">SELECT DISTINCT
       id
      ,max(round) OVER (PARTITION BY id) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>

이 접근 방식은 창 함수를 사용하여 각 ROUND 그룹 내의 최대 SCORE 및 해당 ID을 계산합니다. 그런 다음 DISTINCT 절은 중복 행을 제거하여 ROUND당 가장 높은 ID만 반환되도록 합니다. 이는 여러 테이블을 스캔하는 것에 비해 처리 시간을 크게 줄여줍니다.

동일하게 효과적인 대안 방법은 FIRST_VALUE을 두 번 사용하는 것입니다.

<code class="language-sql">SELECT DISTINCT
       id
      ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>

두 쿼리 모두 동일한 결과를 산출합니다.

ID ROUND SCORE
1 3 2
2 2 12
3 1 6

이러한 최적화된 쿼리는 단일 테이블 스캔에서 그룹당 최대값을 검색하여 덜 효율적인 방법에 비해 상당한 성능 향상을 제공합니다. 이는 대규모 데이터 세트를 처리할 때 응답성을 유지하는 데 중요합니다.

위 내용은 단일 SQL 테이블에서 그룹당 최대값을 효율적으로 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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