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 サイトの他の関連記事を参照してください。