그룹화된 각 SQL 결과에서 최대값 레코드 가져오기
P粉186904731
2023-08-20 18:10:21
<p>각 그룹화의 최대값이 포함된 행을 가져오는 방법은 무엇입니까? </p>
<p>몇 가지 지나치게 복잡한 변형을 보았지만 어느 것도 좋은 답을 주지 못했습니다. 저는 가장 간단한 예를 시도해 보았습니다: </p>
<p>사람, 그룹, 연령에 대한 열이 포함된 아래 표에서 각 그룹의 가장 나이 많은 사람을 어떻게 알 수 있나요? (그룹 내에서 동점일 경우 알파벳순으로 첫 번째 결과를 제공해야 합니다.)</p>
<pre class="brush:php;toolbar:false;">사람 그룹 |
---
밥 | 1 |
질 | 1 |
숀|1 |
제이크 2 |
폴 2 |
로라|2 |39</pre>
<p>원하는 결과 세트: </p>
<pre class="brush:php;toolbar:false;">숀 1 |
로라 | 39</pre>
<p><br /></p>
올바른 해결책은 다음과 같습니다:
으아악작동 방식:
o
中的每一行与具有相同Group
列值和较大Age
列值的b
中的所有行进行匹配。任何o
中的行如果在Age
列中没有其组中的最大值,则会与b
에서 하나 이상의 줄과 일치합니다.LEFT JOIN
使其将组中的最年长的人(包括那些独自一人的人)与来自b
的一行NULL
짝을 맞춰보세요('그룹에 나이 많은 사람 없음').INNER JOIN
을 사용하면 이 줄이 일치하지 않게 되어 무시됩니다.WHERE
子句仅保留从b
中提取的字段中具有NULL
알았어. 그들은 각 그룹에서 가장 연장자입니다.더 읽어보기
이 솔루션과 기타 솔루션은 SQL 안티패턴 볼륨 1: 데이터베이스 프로그래밍의 함정 방지 책에 자세히 설명되어 있습니다.
mysql에서 이 작업을 수행하는 매우 쉬운 방법이 있습니다:
으아악이 방법은 mysql에서는 그룹별로 열이 아닌 집계를 할 수 없기 때문에 가능합니다. 이 경우 mysql은 첫 번째 행만 반환합니다. 해결 방법은 먼저 원하는 순서로 데이터를 정렬한 다음 원하는 열별로 그룹화하는 것입니다.
복잡한 하위 쿼리로
max()
등을 찾는 문제를 방지하고 최대값이 동일한 여러 행이 있을 때 여러 행을 반환하는 문제도 방지합니다(다른 답변에서는 이렇게 합니다).참고: 이것은 mysql 전용 솔루션입니다. 내가 아는 다른 모든 데이터베이스에서는 "그룹 기준 절에 나열되지 않은 집계 열이 아닙니다."라는 오류 메시지와 함께 SQL 구문 오류가 발생합니다. 이 솔루션은 문서화되지 않은 동작을 사용하므로, 보다 신중한 사람이라면 MySQL의 향후 버전에서 이 동작이 변경되는 경우에도 여전히 작동하는지 확인하는 테스트를 포함할 수 있습니다.
버전 5.7 업데이트:
버전 5.7부터
sql-mode
设置默认包含ONLY_FULL_GROUP_BY
이 기능이 작동하려면 이 옵션을 사용하지 해서는 안 됩니다 (이 설정을 제거하려면 서버의 옵션 파일을 편집하세요).