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

MySQLでパーティションをランク付けする方法

    MySQLでパーティションをランク付けしたり、MySQLでグループ化されたランク付けを行う必要がある場合があります。 MySQLランク関数を使用してパーティションをランク付けする方法を見ていきます。このアプローチを使用して、テーブル内の各グループ/パーティション内で個別にランク付けできます。ただし、この関数はMySQL8.0からのみ使用できることに注意してください。


    MySQLランクオーバーパーティション

    MySQL RANK()関数を使用して、グループ内でランク付けします。 MySQLRANK関数の構文は次のとおりです。

    RANK() OVER (
        PARTITION BY <expression>[{,<expression>...}]
        ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
    )
    >

    ランク関数は、各行のランクがそのパーティションでランク付けされた行の総数より1つ多くなるように、パーティション内の各行にランクを割り当てます。

    上記の構文では、PARTITIONBY句は行をパーティションに分割します。 1つ以上の列の値に基づいてテーブルをパーティション化できます。テーブルをパーティション分割したくない場合は、PARTITIONBY句を完全に省略できます。


    ボーナスリード:クエリでMySQLのタイムゾーンを変更する方法

    ランク関数は、各パーティション/グループ内のランクを計算し、新しいパーティションで開始するときにランク番号を再初期化します。

    ORDER BY句は、1つ以上の列の値に基づいて各パーティション内の行を並べ替えます。


    ボーナスリード:MySQLCompareデータベース

    次の表があるとしましょう。

    mysql> create table for_rank(id int, month  varchar(10),amount  int);
    
    mysql> insert into for_rank(id, month, amount)
         values(1,'Jan',450),
         (2,'Jan',350),
         (3,'Jan',250),
         (4,'Feb',150),
         (5,'Feb',450),
         (6,'Feb',500),
         (7,'Mar',350),
         (8,'Mar',450),
         (9,'Mar',250),
         (10,'Mar',150);
    
    mysql> select * from for_rank;
    +------+-------+--------+
    | id   | month | amount |
    +------+-------+--------+
    |    1 | Jan   |    450 |
    |    2 | Jan   |    350 |
    |    3 | Jan   |    250 |
    |    4 | Feb   |    150 |
    |    5 | Feb   |    450 |
    |    6 | Feb   |    500 |
    |    7 | Mar   |    350 |
    |    8 | Mar   |    450 |
    |    9 | Mar   |    250 |
    |   10 | Mar   |    150 |
    +------+-------+--------+


    ボーナスリード:データベース内のMySQL表示インデックス

    PARTITION BY句を使用せずに、テーブルの各行にランクを割り当てるクエリを次に示します。

    SELECT
         id, month, amount, RANK() OVER (
         PARTITION BY Month
         ORDER BY amount desc
         ) my_rank
    FROM for_rank;
    
    +------+-------+--------+--------+
    | id   | month | amount |  rank  |
    +------+-------+--------+--------+
    |    6 | Feb   |    500 |     1  |
    |    5 | Feb   |    450 |     2  |
    |    4 | Feb   |    150 |     3  |
    |    1 | Jan   |    450 |     1  |
    |    2 | Jan   |    350 |     2  |
    |    3 | Jan   |    250 |     3  |
    |    8 | Mar   |    450 |     1  |
    |    7 | Mar   |    350 |     2  |
    |    9 | Mar   |    250 |     3  |
    |   10 | Mar   |    150 |     4  |
    +------+-------+--------+--------+
    

    上記のクエリでは、テーブルを月の名前でパーティション化し、各パーティション内の各行を金額の降順でランク付けします。

    うまくいけば、My​​SQLランク関数を使用してパーティションとグループを簡単にランク付けできるようになりました。

    Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。

    1. CONV()–MySQLの異なるベース間で数値を変換する

    2. PL / SQLを使用して電子メールアドレスを検証する方法は?

    3. Oracle:タイムスタンプに分を追加する方法は?

    4. LATERAL JOINとPostgreSQLのサブクエリの違いは何ですか?