최대 열 값이 있는 행만 선택하는 SQL 쿼리
P粉662614213
2023-08-21 14:17:15
<p>문서 테이블이 있습니다(간단한 버전은 다음과 같습니다). </p>
<테이블 클래스="s-테이블">
<머리>
<tr>
<번째> ID
<번째>rev</th>
<번째> 콘텐츠
</tr>
</머리>
<본문>
<tr>
<td>1</td>
<td>1</td>
<td>...</td>
</tr>
<tr>
<td>2</td>
<td>1</td>
<td>...</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>...</td>
</tr>
<tr>
<td>1</td>
<td>3</td>
<td>...</td>
</tr>
</tbody>
</테이블>
<p>ID당 하나의 행을 선택하고 가장 큰 버전만 선택하는 방법은 무엇입니까? </p><p>
위 데이터에 따르면 결과에는 <code>[1, 3, ...]</code> 및 <code>[2, 1, ..]</code> ;. 저는 <strong><em>MySQL</em></strong>을 사용하고 있습니다. </p>
<p>현재 저는 <code>while</code> 루프에서 검사를 사용하여 결과 집합에서 이전 버전을 감지하고 덮어쓰고 있습니다. 하지만 이것이 결과를 얻는 유일한 방법입니까? <strong>SQL</strong>에 대한 솔루션은 없나요? </p>
저는 가능한 한 적은 코드를 사용하는 것을 선호합니다...
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
을 사용하여 하위 쿼리로 테이블을 조인합니다.으아악
자체 연결을 사용하고 연결 조건 및 필터링 조건을 조정하세요group-identifier
이 접근 방식에서는 테이블 자체에 대한 왼쪽 조인을 수행합니다. Equijoining은NULL
(记住,这是一个LEFT JOIN
)。然后,我们过滤连接结果,只显示右侧为NULL
1단계를 수행하면 실제로 가장 큰 값을 갖는 행의 오른쪽에으아악
결론group-identifier
有两行具有max-value-in-group
max-value-in-group
이 있는 두 개의 행이 있는 경우 두 방법 모두 결과에 두 행을 모두 포함합니다.두 방법 모두 성능 친화적이지만 실제 상황은 다를 수 있습니다(RDBMS, 데이터베이스 구조, 인덱스 등). 따라서 이러한 방법 중 하나를 선택할 때 benchmark
를 수행하세요. 그리고 자신에게 가장 적합한 방법을 선택하십시오. 🎜