ホームページ  >  に質問  >  本文

SQLを使用して最高値を持つ列の行を取得する方法[重複]

ドキュメントの表があります (これは簡略化されたバージョンです):

###変化### ###コンテンツ### 11123ID ごとに 1 つの行を選択し、最大のリビジョンのみを選択するにはどうすればよいですか? 上記のデータに基づくと、結果には
id
... 2
... 1
... 1
...
[1, 3, ...]

[2, 1, ..]

の 2 つの行が含まれるはずです。 MySQL を使用しています。 現在、while ループ内のチェックを使用して、結果セット内の古いリビジョンを検出して上書きしています。しかし、これが結果を達成する唯一の方法でしょうか?

SQL

の解決策はありませんか?

P粉211273535P粉211273535395日前652

全員に返信(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 コミュニティは特にこのタイプの質問に対処するためのタグを作成しました:

    greatest-n-per-group

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

    単純な

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

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

    group-identifier, max-value-in-group

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

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

    group-identifier

    に配置されます。次に、2 つの賢いステップがあります:

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

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

    group-identifier

    max-value-in-group

    を持つ 2 つの行がある場合、これら 2 つの行は両方のメソッドの結果に表示されます。

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

    返事
    0
  • キャンセル返事