다음 문서 양식이 있습니다(간단한 버전은 다음과 같습니다).
<테이블 클래스="s-테이블"> <머리>ID당 하나의 행을 선택하고 가장 큰 RPM만 선택하는 방법은 무엇입니까?
위 데이터를 사용하면 결과에는 [1, 3, ...]
및 [2, 1, ..]
. 저는MySQL을 사용하고 있습니다.
현재 저는 while
루프에서 검사를 사용하여 결과 집합에서 이전 버전을 감지하고 덮어쓰고 있습니다. 하지만 이것이 이 결과를 얻을 수 있는 유일한 방법일까요? SQL 솔루션이 없나요?
저는 가능한 한 적은 코드를 사용하는 것을 선호합니다...
이 작업은
으아아아IN
를 사용하여 수행할 수 있습니다. 이것을 시도해 보세요:제 생각에는 덜 복잡하고... 읽고 유지하기가 더 쉽습니다.
첫눈에...
필요한 것은
이 포함된 절뿐입니다. 으아악MAX
聚合函数的GROUP BY
:일이 그렇게 간단할 수가 없잖아요?
열
content
개도 필요하다는 사실을 방금 확인했습니다.이것은 SQL에서 매우 일반적인 문제입니다. 각 그룹 식별자 열에 최대값이 있는 행의 모든 데이터를 찾습니다. 저는 직장 생활을 하면서 이런 말을 자주 듣습니다. 사실 이것은 제가 현 직장에서 기술면접을 할 때 대답한 질문 중 하나였습니다.
실제로 Stack Overflow 커뮤니티에서는 다음과 같은 질문을 처리하기 위해greatest-n-per-group이라는 태그를 만들었습니다.
기본적으로 이 문제를 해결하는 방법에는 두 가지가 있습니다.
간단한
group-identifier, max-value-in-group
하위 쿼리 조인 사용이 접근 방식에서는 먼저 하위 쿼리에서
및group-identifier, max-value-in-group
(上面已解决)。然后,将表连接到子查询,并在group-identifier
和max-value-in-group
를 찾습니다(위에서 해결됨). 그런 다음 테이블을 하위 쿼리에 조인하고max-value-in-group
에서 동일하게 만듭니다.으아악
왼쪽 조인, 조인 조건 및 필터 조정
에는 평등이 존재합니다. 그런 다음 2가지 현명한 움직임:group-identifier
이 방법에서는 테이블 자체를 조인하게 됩니다.두 번째 연결 조건은 왼쪽 값이 오른쪽 값보다 작다는 것 , 기억하시나요? ). 그런 다음 조인 결과를 필터링하여 오른쪽에 NULL이 있는 행만 표시합니다.
결국:NULL
(这是一个LEFT JOIN
1단계를 수행하면 실제로 가장 큰 값을 갖는 행이 오른쪽에 표시됩니다으아악
결론 두 가지 방법 모두 동일한 결과를 가져옵니다.
이 있는 경우 두 방법의 결과에 두 행이 모두 표시됩니다. 두 가지 방법 모두 SQL ANSI와 호환되므로 "특성"에 관계없이 선호하는 RDBMS와 함께 작동합니다.group-identifier
具有max-value-in-group
max-value-in-group
이 포함된 두 개의 행두 접근 방식 모두 성능 친화적이지만 상황이 다를 수 있습니다(RDBMS, 데이터베이스 구조, 인덱스 등). 따라서 다른 방법보다 한 가지 방법을 선택할 때Benchmark
를 사용하세요. 그리고 자신에게 가장 적합한 것을 선택하십시오.