最大値を持つ行のみを選択する SQL クエリ
P粉752479467
2023-08-22 10:03:28
<p>ドキュメント テーブルがあります (これは簡略化されたバージョンです): </p>
<テーブルクラス="s-テーブル">
<頭>
<tr>
id |
rev |
コンテンツ |
</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 行を選択し、最大のリビジョンのみを選択するにはどうすればよいですか? </p><p>
上記のデータに基づくと、結果には <code>[1, 3, ...]</code> および <code>[2, 1, ..]</code> の 2 つの行が含まれるはずです。 ;。私は <strong><em>MySQL</em></strong> を使用しています。 </p>
<p>現在、<code>while</code> ループ内のチェックを使用して、結果セット内の古い Rev を検出して上書きしています。しかし、これが結果を達成する唯一の方法でしょうか? <strong>SQL</strong> の解決策はありませんか? </p>
使用するコードはできるだけ少なくしたいと思っています...
私の意見では、これはよりシンプルで、読みやすく、保守しやすいです。IN
を使用して達成できます これを試して:### リーリー###一目見ただけで...###
句で
contentMAX
集計関数を使用するだけで済みます。リーリー
物事は決して単純ではありませんね。列も必要であることに今気づきました。
これは SQL で非常に一般的な問題です。特定のグループ化識別子に基づいて、列内の最大値に対応する完全なデータを見つけます。私のキャリアの中で、この質問をよく聞いてきました。実際、私は現在の職場での技術面接中にこれらの質問の 1 つに答えました。
この質問は実際に非常に一般的であるため、Stack Overflow コミュニティは特にこのタイプの問題に対処するためのタグ
greatest-n-per-groupを作成しました。 基本的に、この問題を解決するには 2 つの方法があります:
単純な
グループ識別子、グループ内の最大値を使用しますサブクエリを使用して接続します
このアプローチでは、最初にサブクエリで
group-identifier, max-value-in-group(上ですでに解決済み) を見つけます。次に、等結合に
このアプローチでは、テーブルをそれ自体に結合したままにします。group-identifier
とmax-value-in-group
を使用して、テーブルをサブクエリと結合します。 リーリー左結合に自己結合を使用し、接続条件とフィルタリング条件を調整します
グループ識別子
での等結合。次に、2 つの賢いステップがあります:ステップ 1 を実行すると、実際に最大値を持つ行の右側に- NULL
が表示されます (これは - LEFT JOIN
つまり、最終的には次のようになります:
リーリー
###結論は###
これら 2 つの方法で得られる結果はまったく同じです。であることに注意してください)。次に、結合結果をフィルタリングして、右側に
NULLを持つ行のみを表示します。
group-identifier
とmax-value-in-group
を持つ 2 つの行がある場合、両方のメソッドの結果に両方の行が含まれます。どちらの方法も SQL ANSI と互換性があるため、使用している RDBMS に関係なく、その「スタイル」に関係なく両方の方法を使用できます。
どちらの方法も非常に効率的ですが、具体的な効果は異なる場合があります (RDBMS、データベース構造、インデックスなど)。したがって、これらの方法のいずれかを選択する場合は、
ベンチマーク