SQL でのグループごとの上位 N レコードの取得
このガイドでは、SQL テーブル内の各グループの上位 N 個のレコードを効率的に取得し、年齢順 (降順)、次に個人名のアルファベット順に並べて同順位を処理する方法を説明します。
シナリオ:
人々、所属グループ、年齢に関する情報を含むテーブルを想像してください。
Person | Group | Age |
---|---|---|
Bob | 1 | 32 |
Jill | 1 | 34 |
Shawn | 1 | 42 |
Jake | 2 | 29 |
Paul | 2 | 36 |
Laura | 2 | 39 |
目標は、各グループの上位 2 (N=2) レコードを取得し、高齢者を優先し、アルファベット順を使用して関係を解決することです。望ましい出力は次のとおりです:
Person | Group | Age |
---|---|---|
Shawn | 1 | 42 |
Jill | 1 | 34 |
Laura | 2 | 39 |
Paul | 2 | 36 |
ソリューション:
2つの一般的なアプローチが表示されます:UNION ALL
とROW_NUMBER()
ウィンドウ関数。
メソッド1:ユニオンすべての使用(大規模なデータセットではそれほど効率的ではない)
この方法は簡単ですが、多くのグループとグループごとに多数のレコードを持つテーブルでは非効率的になる可能性があります。 グループごとに個別のクエリを作成し、UNION ALL
を使用して結果を組み合わせることが含まれます。 この例では、各グループの上位2レコード(n = 2)を取得します。
<code class="language-sql">( SELECT * FROM mytable WHERE `group` = 1 ORDER BY age DESC, person LIMIT 2 ) UNION ALL ( SELECT * FROM mytable WHERE `group` = 2 ORDER BY age DESC, person LIMIT 2 )</code>
の使用
ウィンドウ関数は、より効率的でスケーラブルなソリューションを提供します。指定された順序に基づいて、各グループ内の各行に一意のランクを割り当てます。
このクエリは、最初に各グループ内の各行にランク(ROW_NUMBER()
)を割り当て、年齢(下降)、次に人の名前で注文します。次に、外部クエリは結果をフィルタリングして、ランクが2(n = 2)以下の行のみを含むようにします。 このアプローチははるかに効率的であり、nの異なる値とさまざまな数のグループに簡単に適応できます。
<code class="language-sql">SELECT person, `group`, age FROM ( SELECT person, `group`, age, ROW_NUMBER() OVER (PARTITION BY `group` ORDER BY age DESC, person) as rn FROM mytable ) as ranked_data WHERE rn <= 2;</code>
rn
https://www.php.cn/link/131632cb7eeb986974e1be59af67e8fe
以上がSQLの各グループのトップNレコードを取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。