MySQL テーブルから特定の列ごとにグループ化された上位 N 個の最大値を取得するにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-11-10 05:33:02
オリジナル
192 人が閲覧しました

How do you retrieve the top N maximum values from a MySQL table, grouped by a specific column?

MySQL テーブルから上位 N 個の最大値を取得する

データ分析の一般的なタスクには、特定の列の上位 N 個の最大値を選択することが含まれますテーブルから。次の表を考えてみましょう:

column1 column2
1 foo
2 foo
3 foo
4 foo
5 bar
6 bar
7 bar
8 bar

問題ステートメント:

指定された n の値に対して、column2 でグループ化された、column1 の上位 n 個の最大値を取得します。上記の例では、n=2 の場合、望ましい出力は次のようになります:

column1
3
4
7
8

解決策:

一方、単純なアプローチには、列 2 で行をグループ化することが含まれる場合があります。各グループの最大値を選択すると、各グループの絶対最大値のみが返されます。上位 n 個の値を取得するには、より高度なアプローチが必要です。

UNION ベースのアプローチ:

1 つのアプローチでは、UNION 句を使用して、それぞれが一致する複数のクエリを結合します。別のグループの最大値を選択します。 n=2 の場合、次のクエリで十分です。

SELECT max(column1) m
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) WHERE column2 = t.column2)
ログイン後にコピー

ランクベースのアプローチ:

より柔軟な n 値の場合、ランクベースのアプローチを使用できます。雇用されている。これには、column1 の値に基づいて各行にランクを割り当て、上位 n ランクの行を選択することが含まれます。次のクエリは、このアプローチを実装しています。

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid
ログイン後にコピー

'grouper' をグループ化列の名前に置き換え、'val' を値を保持する列に置き換えます。

LIMIT 句は、各グループの n 番目にランク付けされた値を定義します。次に、この n 番目にランク付けされた値より大きい値を持つ行が選択されます。

結論:

どちらのアプローチも、テーブルから上位 n 個の最大値を選択する効果的な方法を提供します。独自の強みと限界があります。共用体ベースのアプローチは単純かつ堅牢ですが、ランクベースのアプローチは取得する最大値の数を柔軟に指定できます。

以上がMySQL テーブルから特定の列ごとにグループ化された上位 N 個の最大値を取得するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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