グループ化された各結果の最初の n レコードを取得します
P粉785957729
P粉785957729 2023-08-21 19:55:22
0
2
458
<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粉785957729
P粉785957729

全員に返信(2)
P粉340264283

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

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

オンライン デモ: sqlfiddle


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

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

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

いいねを押す +0
P粉404539732

これを行う 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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート