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

グループ化された各結果の最初の n レコードを取得します

<p>以下は最も単純な例ですが、どのソリューションも必要な上位 n 件の結果に合わせて拡張できる必要があります。</p> <p>次の表に人、グループ、年齢の列が含まれている場合、各グループの最年長 2 人をどのように取得しますか? (グループ内で同点の場合、それ以上の結果は生成されませんが、上位 2 つがアルファベット順に表示されます) </p> <前> -------- ------- ----- | 人物 | グループ | 年齢 | -------- ------- ----- | ボブ | 1 | 32 | |ジル|1|34| | ショーン | 1 | 42 | | ジェイク | 2 | 29 | | ポール | 2 | 36 | | ローラ | 2 | 39 | -------- ------- ----- </pre> <p>必要な結果セット: </p> <前> -------- ------- ----- | ショーン | 1 | 42 | |ジル|1|34| | ローラ | 2 | 39 | | ポール | 2 | 36 | -------- ------- ----- </pre> <時間>

@Bohemian から MySQL 固有の優れた回答を得ました: </p> <pre class="brush:php;toolbar:false;">select * from (select * from mytable order by `Group`、年齢記述、人物) x `Group` ごとにグループ化</pre> <p>これを基に構築できれば良いのですが、その方法がわかりません。 </p>

P粉785957729P粉785957729447日前428

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

  • P粉340264283

    P粉3402642832023-08-22 19:25:52

    他のデータベースでは、ROW_NUMBER を使用してこの機能を実現できます。 MySQL は ROW_NUMBER をサポートしていませんが、変数

    を使用してシミュレートできます。 リーリー

    オンライン デモ: sqlfiddle


    編集 bluefeet が非常によく似た回答を投稿していることに今気づきました。「彼に 1 を与えてください。」しかし、この答えには 2 つの小さな利点があります:

    1. これは単一のクエリです。変数は SELECT ステートメント内で初期化されます。
    2. 質問で説明されている並列ケースを処理します (名前のアルファベット順)。

    したがって、誰かに役立つ場合に備えて残しておきます。

    返事
    0
  • P粉404539732

    P粉4045397322023-08-22 13:19:02

    これを行う 1 つの方法は、UNION ALL を使用することです (デモ付きの SQL Fiddle を参照)。これは 2 つのグループに対して機能します。複数のグループがある場合は、group 番号を指定し、各 group:

    にクエリを追加する必要があります。 リーリー

    これを実現するには複数の方法があります。この記事を参照して、状況に最適な方法を決定してください:

    http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

    ###編集:###

    これは、各レコードの行番号を生成するので、うまくいくかもしれません。上記のリンクの例を使用すると、行番号が 2 以下のレコードのみが返されます:

    リーリー

    参照

    デモ

    返事
    0
  • キャンセル返事