<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>
他のデータベースでは、
を使用してシミュレートできます。 リーリーROW_NUMBER
を使用してこの機能を実現できます。 MySQL はROW_NUMBER
をサポートしていませんが、変数オンライン デモ: sqlfiddle
編集 bluefeet が非常によく似た回答を投稿していることに今気づきました。「彼に 1 を与えてください。」しかし、この答えには 2 つの小さな利点があります:
したがって、誰かに役立つ場合に備えて残しておきます。
これを行う 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 以下のレコードのみが返されます:
リーリー参照
デモ