>  Q&A  >  본문

SQL을 사용하여 가장 높은 값을 가진 열의 행을 검색하는 방법

문서 테이블이 있습니다(간단한 버전은 다음과 같습니다):

id 리디렉션 콘텐츠
1 1 ...
2 1 ...
1 2 ...
1 3 ...

각 ID에 대해 하나의 행을 선택하고 가장 큰 버전만 선택하는 방법은 무엇입니까?

위 데이터를 바탕으로 결과에는 [1, 3, ...][2, 1, ..]라는 두 줄이 포함되어야 합니다. 저는 MySQL을 사용하고 있습니다.

현재 결과 세트에서 이전 버전을 감지하고 덮어쓰기 위해 while루프에서 검사를 사용하고 있습니다. 그러나 이것이 결과를 얻는 유일한 방법입니까? SQL 솔루션은 없나요?

P粉211273535P粉211273535395일 전654

모든 응답(2)나는 대답할 것이다

  • P粉714780768

    P粉7147807682023-09-21 12:21:06

    저는 가능한 한 적은 코드를 사용하는 것을 선호합니다...

    IN를 사용하여 달성할 수 있습니다. 이것을 시도해 보세요:

    으아악

    제 생각에는 이것이 더 간단하고... 읽고 유지하기가 더 쉽습니다.

    회신하다
    0
  • P粉336536706

    P粉3365367062023-09-21 09:25:48

    첫눈에...

    GROUP BY子句中使用MAX집계 함수만 있으면 됩니다:

    으아악

    일이 그렇게 간단할 수가 없잖아요?

    content개도 필요하다는 사실을 방금 확인했습니다.

    SQL에서 이는 매우 일반적인 문제입니다. 특정 그룹 식별자를 기반으로 특정 열에서 최대값을 갖는 전체 데이터 행을 찾습니다. 나는 직장생활을 하면서 이런 질문을 많이 들어왔습니다. 사실 이 질문은 제가 현 직무에 대한 기술면접에서 답변한 질문입니다.

    이 질문은 실제로 너무 일반적이기 때문에 Stack Overflow 커뮤니티에서는 이러한 유형의 질문을 처리하기 위해 특별히 태그를 만들었습니다: .

    기본적으로 이 문제를 해결하는 방법에는 두 가지가 있습니다.

    간단한 group-identifier, max-value-in-group하위 쿼리

    를 사용하여 참여

    이 접근 방식에서는 먼저 하위 쿼리에서 group-identifier, max-value-in-group(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifiermax-value-in-group를 찾습니다(위에서 이미 해결됨). 그런 다음 동등 조인에

    max-value-in-group을 사용하여 하위 쿼리로 테이블을 조인합니다.

    으아악

    왼쪽 조인에 셀프 조인을 사용하고 조인 조건 및 필터 조건을 조정하세요

    group-identifier이 접근 방식에서는 테이블 자체에 대한 왼쪽 조인을 수행합니다. Equijoin은

    에 배치됩니다. 그런 다음 두 가지 영리한 단계가 있습니다:
    1. 두 번째 연결 조건은 왼쪽 값이 오른쪽 값보다 작다는 것
    2. NULL(记住这是一个LEFT JOIN)。然后,我们过滤连接的结果,只显示右侧为NULL1단계를 수행할 때 실제로 가장 큰 값을 갖는 행은 오른쪽에
    3. 가 표시된 행이 됩니다.

    결국 다음과 같이 됩니다:

    으아악

    결론

    두 가지 방법 모두 정확히 동일한 결과를 제공합니다.

    group-identifier中有两行具有max-value-in-group

    max-value-in-group이 있는 두 개의 행이 있는 경우 이 두 행은 두 방법 모두의 결과에 나타납니다.

    두 방법 모두 SQL ANSI와 호환되므로 선호하는 RDBMS의 "방향"에 관계없이 사용할 수 있습니다.

    두 방법 모두 성능 친화적이지만 실제 상황은 다를 수 있습니다(RDBMS, 데이터베이스 구조, 인덱스 등). 따라서 방법을 선택할 때 벤치마킹

    을 수행하세요. 자신에게 가장 적합한 방법을 선택하십시오. 🎜

    회신하다
    0
  • 취소회신하다