집 >데이터 베이스 >MySQL 튜토리얼 >관계형 데이터베이스에서 그룹당 최대값이 있는 행을 효율적으로 검색하려면 어떻게 해야 합니까?
관계형 데이터베이스의 그룹 내에서 효율적으로 최대값 찾기
관계형 데이터베이스 내에서 그룹 무결성을 유지하면서 특정 열의 최대값이 포함된 행을 추출하는 것은 복잡할 수 있습니다. 이 문서에서는 쿼리 효율성을 우선시하면서 각 고유 ID에 대해 가장 높은 반올림 번호가 있는 행을 검색하는 문제를 다룹니다.
하위 쿼리를 사용하는 한 가지 방법은 다음과 같습니다.
<code class="language-sql">SELECT * FROM (SELECT id, round, CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score FROM SCORES where id in (1,2,3) ) scorevals WHERE scorevals.round is not null;</code>
그러나 이 접근 방식은 후처리 필터링 단계로 인해 비효율적입니다.
성능 향상을 위해 창 기능 사용을 고려해 보세요.
<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>
이 쿼리는 창 기능을 사용하여 각 ID의 최대 라운드를 결정한 다음 해당 점수를 검색합니다. DISTINCT
키워드는 ID당 단일 행을 보장합니다.
동일한 창 기능을 두 번 사용하는 잠재적으로 더 빠른 대안:
<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>
두 가지 최적화 솔루션 모두 불필요한 필터링을 방지하여 하위 쿼리 접근 방식에 비해 쿼리 실행 시간이 더 빠릅니다.
위 내용은 관계형 데이터베이스에서 그룹당 최대값이 있는 행을 효율적으로 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!