SQLは列に最大値を持つ行のみを選択します
P粉937382230
2023-08-23 11:08:57
<p>この文書フォームがあります (これは簡略化されたバージョンです): </p>
<テーブルクラス="s-テーブル">
<頭>
<tr>
id |
<th>転送</th>
<th>コンテンツ</th>
</tr>
</頭>
<みんな>
<tr>
1 |
1 |
<td>...</td>
</tr>
<tr>
2 |
1 |
<td>...</td>
</tr>
<tr>
1 |
2 |
<td>...</td>
</tr>
<tr>
1 |
3 |
<td>...</td>
</tr>
</tbody>
</テーブル>
<p>ID ごとに 1 行を選択し、最大の RPM のみを選択するにはどうすればよいですか? </p><p>
上記のデータを使用すると、結果には <code>[1, 3, ...]</code> と <code>[2, 1, ..]</code> の 2 つの行が含まれるはずです。 。私は<em><strong>MySQL</strong></em>を使用しています。 </p>
<p>現在、<code>while</code> ループ内のチェックを使用して、結果セット内の古い Rev を検出して上書きしています。しかし、これがこの結果を達成する唯一の方法でしょうか? <strong>SQL</strong> ソリューションをお持ちですか? </p>
私の好みは、使用するコードをできるだけ少なくすることです...
IN
を使用してこれを行うことができます これを試して:### リーリー###一目見ただけで...###
必要なのは、
MAX集計関数を含む
contentGROUP BY
句だけです:リーリー
物事は決して単純ではありませんね。列も必要であることに今気づきました。
これは SQL で非常に一般的な問題です。各グループ識別子の列に最大値がある行のすべてのデータを検索します。私のキャリアの中で、この言葉をよく聞きます。実際、これは私が現在の職場での技術面接で答えた質問の 1 つです。
実際、Stack Overflow コミュニティは、次のような質問に対処するためのタグを作成しました:
greatest-n-per-group。 基本的に、この問題を解決するには 2 つの方法があります:
単純な
グループ識別子、グループ内の最大値を使用するサブクエリ結合
このアプローチでは、まずサブクエリ内で
group-identifier, max-value-in-group(上記で解決済み) を見つけます。次に、テーブルをサブクエリに結合し、
group-identifier
とmax-value-in-group
を等しくします。リーリー
self との結合を解除し、接続条件とフィルターを調整しますこのアプローチでは、テーブルをそれ自体に結合したままにします。
グループ識別子には等価性が存在します。次に、2 つの賢い方法:
2 番目の接続条件は、左側の値が右側の値より小さいことです。LEFT JOIN
です、覚えていますか?)。次に、結合結果をフィルタリングして、右側に NULL を含む行のみを表示します。どちらの方法でもまったく同じ結果が得られます。
2 つの行
group-identifierと
max-value-in-groupがある場合、両方の行が両方のメソッドの結果に表示されます。
どちらの方法も SQL ANSI と互換性があるため、「フレーバー」に関係なく、お気に入りの RDBMS で動作します。
どちらのアプローチもパフォーマンスに優れていますが、状況は異なる場合があります (RDBMS、データベース構造、インデックスなど)。したがって、ある方法を別の方法より選択する場合は、
ベースラインになります。そして、自分にとって最も意味のあるものを選択してください。