ホームページ > データベース > mysql チュートリアル > MySQL でグループごとに上位 N 行のみを取得するにはどうすればよいですか?

MySQL でグループごとに上位 N 行のみを取得するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-25 11:57:10
オリジナル
867 人が閲覧しました

How to Retrieve Only the Top N Rows per Group in MySQL?

MySQL は各グループの最初の N 行のデータを効率的に取得します

問題の説明:

データベース クエリでは、各データ グループの最初の N 行のデータのみを取得する必要がある場合があります。たとえば、データセットには、年と ID でグループ化された複数行の情報が含まれている場合があります。 ID ごとに評価の高い上位 5 件のレコードを表示したい場合は、結果を目的の数に制限するメソッドを実装する必要があります。

解決策:

MySQL 8 以降では、ROW_NUMBER、RANK、または DENSE_RANK 関数を使用してこれを実現できます。選択する特定の関数は、「最初の N 行」の正確な定義と、並列状況を処理する方法によって異なります。これらの関数によって生成された結果の内訳は次のとおりです:

  • ROW_NUMBER: 各グループ内の行に 1 から始まるシーケンス番号を割り当てます。この関数は、同じ値を持つ行に同じランクを与えて関係を解消したい場合に最適です。
  • RANK: 各グループ内の行にランキングを割り当てます。同点の場合は同じランキングになります。この機能は、さまざまなランキングに優先順位を付ける場合に便利です。
  • DENSE_RANK: RANK に似ていますが、密なランキングを割り当てます。つまり、同点であってもランキング間にギャップはありません。この関数は、後続の行が一意のランキングを持つようにしたい場合に適しています。

例:

次のクエリは ROW_NUMBER 関数を使用して、各 ID の最初の 5 行を評価の降順に並べて返します。

<code class="language-sql">SELECT
    year, id, rate
FROM (
    SELECT
        year, id, rate,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY rate DESC) AS rank_num
    FROM h
    WHERE year BETWEEN 2000 AND 2009
) AS subquery
WHERE rank_num <= 5;</code>
ログイン後にコピー

出力:

year id rate
2006 p01 8.0
2003 p01 7.4
2008 p01 6.8
2001 p01 5.9
2007 p01 5.3
2001 p02 12.5
2004 p02 12.4
2002 p02 12.2
2003 p02 10.3
2000 p02 8.7

これらの関数を使用すると、結果を各グループの最初の N 行に効果的に制限し、データを望ましい順序で並べることができます。

以上がMySQL でグループごとに上位 N 行のみを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート