最大列値を持つ行のみを選択する SQL クエリ
P粉662614213
P粉662614213 2023-08-21 14:17:15
0
2
391
<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>
P粉662614213
P粉662614213

全員に返信(2)
P粉909476457

使用するコードはできるだけ少なくしたいと思っています...

IN を使用して達成できます これを試して:### リーリー

私の意見では、これはよりシンプルで、読みやすく、保守しやすいです。

いいねを押す +0
P粉287345251

###一目見ただけで...###

GROUP BY

句と MAX 集計関数を使用するだけです。 リーリー 物事は決して単純ではありませんよね?

content

列も必要であることに今気づきました。 これは SQL で非常に一般的な問題です。特定のグループ化識別子に基づいて、列内の最大値を持つデータの行全体を検索します。私のキャリアの中で、この質問をよく聞いてきました。実際、これは私が現在の職場での技術面接で答えた質問の 1 つです。

この質問は実際に非常に一般的であるため、Stack Overflow コミュニティはこのタイプの質問に対処するためのタグ

greatest-n-per-group

を作成しました。 基本的に、この問題を解決するには 2 つの方法があります:

単純な

グループ識別子、グループ内の最大値を使用します

サブクエリを使用して接続します このアプローチでは、最初にサブクエリで

group-identifier, max-value-in-group

(上ですでに解決済み) を見つけます。次に、等結合に group-identifiermax-value-in-group を使用して、テーブルをサブクエリと結合します。 リーリー 自己接続を使用し、接続条件とフィルタリング条件を調整します

このアプローチでは、テーブルをそれ自体に結合したままにします。等価結合は

グループ識別子

に対して実行されます。次に、2 つの賢いステップがあります:

2 番目の接続条件は、左側の値が右側の値より小さいことです。

    ステップ 1 を実行すると、実際に最大値を持つ行の右側に
  1. NULL
  2. が表示されます (これは
  3. LEFT JOIN であることに注意してください)。次に、結合結果をフィルタリングして、右側に NULL を持つ行のみを表示します。 したがって、最終的には次のようになります:
  4. リーリー ###結論は###
これら 2 つの方法で得られる結果はまったく同じです。

group-identifier

max-value-in-group

を持つ行が 2 つある場合、両方のメソッドの結果に両方の行が含まれます。

どちらの方法も SQL ANSI と互換性があるため、好みの RDBMS の「フレーバー」に関係なく使用できます。 どちらの方法もパフォーマンスに優れていますが、実際の状況は異なる場合があります (RDBMS、データベース構造、インデックスなど)。したがって、これらの方法のいずれかを選択する場合は、ベンチマーク

。そして、自分にとって最も合理的な方法を必ず選択してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート