그룹화된 각 SQL 결과에서 최대값 레코드 가져오기
P粉186904731
P粉186904731 2023-08-20 18:10:21
0
2
532
<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>
P粉186904731
P粉186904731

모든 응답(2)
P粉518799557

올바른 해결책은 다음과 같습니다:

으아악

작동 방식:

o中的每一行与具有相同Group列值和较大Age列值的b中的所有行进行匹配。任何o中的行如果在Age列中没有其组中的最大值,则会与b에서 하나 이상의 줄과 일치합니다.

LEFT JOIN使其将组中的最年长的人(包括那些独自一人的人)与来自b的一行NULL짝을 맞춰보세요('그룹에 나이 많은 사람 없음').
INNER JOIN을 사용하면 이 줄이 일치하지 않게 되어 무시됩니다.

WHERE子句仅保留从b中提取的字段中具有NULL 알았어. 그들은 각 그룹에서 가장 연장자입니다.

더 읽어보기

이 솔루션과 기타 솔루션은 SQL 안티패턴 볼륨 1: 데이터베이스 프로그래밍의 함정 방지 책에 자세히 설명되어 있습니다.

P粉741678385

mysql에서 이 작업을 수행하는 매우 쉬운 방법이 있습니다:

으아악

이 방법은 mysql에서는 그룹별로 열이 아닌 집계를 할 수 없기 때문에 가능합니다. 이 경우 mysql은 첫 번째 행만 반환합니다. 해결 방법은 먼저 원하는 순서로 데이터를 정렬한 다음 원하는 열별로 그룹화하는 것입니다.

복잡한 하위 쿼리로 max() 등을 찾는 문제를 방지하고 최대값이 동일한 여러 행이 있을 때 여러 행을 반환하는 문제도 방지합니다(다른 답변에서는 이렇게 합니다).

참고: 이것은 mysql 전용 솔루션입니다. 내가 아는 다른 모든 데이터베이스에서는 "그룹 기준 절에 나열되지 않은 집계 열이 아닙니다."라는 오류 메시지와 함께 SQL 구문 오류가 발생합니다. 이 솔루션은 문서화되지 않은 동작을 사용하므로, 보다 신중한 사람이라면 MySQL의 향후 버전에서 이 동작이 변경되는 경우에도 여전히 작동하는지 확인하는 테스트를 포함할 수 있습니다.

버전 5.7 업데이트:

버전 5.7부터 sql-mode设置默认包含ONLY_FULL_GROUP_BY 이 기능이 작동하려면 이 옵션을 사용하지 해서는 안 됩니다 (이 설정을 제거하려면 서버의 옵션 파일을 편집하세요).

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿