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

SQLは列に最大値を持つ行のみを選択します

<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>
P粉937382230P粉937382230445日前435

全員に返信(2)返信します

  • P粉638343995

    P粉6383439952023-08-24 09:47:12

    私の好みは、使用するコードをできるだけ少なくすることです...

    IN を使用してこれを行うことができます これを試して:### リーリー

    私の意見では、これはそれほど複雑ではなく、読みやすく、保守しやすいです。

    返事
    0
  • P粉517475670

    P粉5174756702023-08-24 09:16:15

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

    必要なのは、

    MAX

    集計関数を含む GROUP BY 句だけです: リーリー 物事は決して単純ではありませんね。

    content

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

    実際、Stack Overflow コミュニティは、次のような質問に対処するためのタグを作成しました:

    greatest-n-per-group

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

    単純な

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

    サブクエリ結合 このアプローチでは、まずサブクエリ内で

    group-identifier, max-value-in-group

    (上記で解決済み) を見つけます。次に、テーブルをサブクエリに結合し、group-identifiermax-value-in-group を等しくします。 リーリー self との結合を解除し、接続条件とフィルターを調整します

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

    グループ識別子

    には等価性が存在します。次に、2 つの賢い方法:

    2 番目の接続条件は、左側の値が右側の値より小さいことです。
    1. ステップ 1 を実行すると、実際に最大値を持つ行の右側に
    2. NULL
    3. が表示されます (これは LEFT JOIN です、​​覚えていますか?)。次に、結合結果をフィルタリングして、右側に NULL を含む行のみを表示します。
    4. したがって、最終的には次のようになります:
    リーリー ###結論は###

    どちらの方法でもまったく同じ結果が得られます。

    2 つの行

    group-identifier

    max-value-in-group

    がある場合、両方の行が両方のメソッドの結果に表示されます。 どちらの方法も SQL ANSI と互換性があるため、「フレーバー」に関係なく、お気に入りの RDBMS で動作します。 どちらのアプローチもパフォーマンスに優れていますが、状況は異なる場合があります (RDBMS、データベース構造、インデックスなど)。したがって、ある方法を別の方法より選択する場合は、

    ベースライン

    になります。そして、自分にとって最も意味のあるものを選択してください。

    返事
    0
  • キャンセル返事