sql >> データベース >  >> RDS >> Mysql

mysql select top n max values

    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についても、ここで説明されているアプローチを使用できます パーティション上のランクをシミュレートします。

    編集:実際にはこれ 記事はあなたが必要なものを正確に提供します。

    基本的にはこんな感じです

    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 値を保持する列の名前を使用します。

    それがどのように機能するかを正確に理解するには、最も内側のクエリから段階的に実行して実行します。

    また、わずかに単純化されています-midを見つけるサブクエリ 特定のカテゴリに十分な値がない場合はNULLを返す可能性があるため、比較で意味のある定数へのCOALESCEが必要です(この場合、valのドメインのMINになり、記事ではMAXになります)。

    編集2: n(LIMIT n、1)を決定するのはLIMIT2,1であることを忘れました。



    1. ルーム-外部SQLiteと内部DBの使用

    2. OracleのUSER関数

    3. レルムからSqliteに移行することは可能ですか?

    4. ワンクリックで複数のSQLServerに接続する方法(登録サーバーグループ)-SQL Server/TSQLチュートリアルパート5