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

MySQLの頻度からパーセンタイルを計算する

    MySQLの頻度またはカウントからパーセンタイルを計算したい場合があります。たとえば、総売上高ではなく、購入または注文の数に基づいて顧客をランク付けする場合。まだ機能はありません。これを行うための既製のクエリがあります。

    例:テーブルの注文があります これには、各ユーザーのすべての製品注文が含まれています。注文の頻度からパーセンタイルを計算したい。

    order
    +------+--------------+-------------+
    |  user_id  |   product  |   sales  |
    +-----------+------------+----------+
    |     1     |     Soap   |    10    |
    |     4     |   Perfume  |   100    |
    |     1     |   Noodles  |   20     |
    |     4     |     Soap   |   10     |
    |     1     |    Glue    |   20     |
    |     3     |     Deo    |   200    |
    +-----------+------------+----------+
    percentiles
    +-----------+----------+---------+---------------+
    |  user_id  |   total  |  rank   |   percentile  |
    +-----------+----------+---------+---------------+
    |     1     |     3    |    1    |      100      |
    |     4     |     2    |    2    |     66.67     |
    |     3     |     1    |    3    |     33.33     |
    +-----------+----------+---------+---------------+

    これは、MySQLの頻度またはカウントからパーセンタイルを計算するために使用できるクエリです。列(user_id、sales、table)を置き換えるだけです。各ユーザーの注文数をカウントします。次に、注文数でランク付けします。最後に、ランクを使用してパーセンタイルを計算します。

    select user_id,total,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from   
    (SELECT  user_id,total,@curRank := @curRank + 1 AS rank
    FROM      (select user_id,count(sales) as total from `order` group by user_id)
    p, (SELECT @curRank := 0) r
    ORDER BY  total desc ) as dt,(select count(distinct user_id) as cnt from
    `order`) as ct

    テーブル内の各ユーザーの注文数がすでにあり、テーブルを直接使用して頻度またはカウントからパーセンタイルを計算する場合は、ここにクエリがあります

    select user_id,total,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from   
    (SELECT  user_id,total,@curRank := @curRank + 1 AS rank
    FROM   `order`
    p, (SELECT @curRank := 0) r
    ORDER BY  total desc ) as dt,(select count(distinct user_id) as cnt from
    `order`) as ct
    order
    +-----------+----------+
    |  user_id  |   total  |
    +-----------+----------+
    |     1     |    3     |
    |     4     |    2     |
    |     3     |    1     |
    +-----------+----------+
    percentiles
    +-----------+----------+---------+---------------+
    |  user_id  |   total  |  rank   |   percentile  |
    +-----------+----------+---------+---------------+
    |     1     |     3    |    1    |      100      |
    |     4     |     2    |    2    |     66.67     |
    |     3     |     1    |    3    |     33.33     |
    +-----------+----------+---------+---------------+

    ご覧のとおり、最後にランク付けされたユーザーのパーセンタイルはゼロではありません。これがパーセンタイル計算の性質です。最初の人が100パーセンタイルを持つか、最後にランク付けされた人がゼロになる可能性があります。両方を同時に発生させることはできません。最後にランク付けされた人にゼロパーセンタイルを強制する場合は、次のクエリを使用できます。パーセンタイルを計算している間、ランクに1を追加していません。

    select user_id,total,rank,round(100*(cnt-rank)/cnt,0) as percentile from   
    (SELECT  user_id,total,@curRank := @curRank + 1 AS rank
    FROM      (select user_id,count(sales) as total from `order` group by user_id)
    p, (SELECT @curRank := 0) r
    ORDER BY  total desc ) as dt,(select count(distinct user_id) as cnt from
    `order`) as ct

    テーブルに各ユーザーの総売上高がすでにあり、テーブルを直接使用してパーセンタイルを計算したい場合は、ここにクエリがあります

    select user_id,total,rank,round(100*(cnt-rank)/cnt,0) as percentile from   
    (SELECT  user_id,total,@curRank := @curRank + 1 AS rank
    FROM   `order`
    p, (SELECT @curRank := 0) r
    ORDER BY  total desc ) as dt,(select count(distinct user_id) as cnt from
    `order`) as ct
    percentiles
    +-----------+----------+---------+---------------+
    |  user_id  |   total  |  rank   |   percentile  |
    +-----------+----------+---------+---------------+
    |     1     |    3     |    1    |     66.67     |
    |     4     |    2     |    2    |     33.33     |
    |     3     |    1     |    3    |       0       |
    +-----------+----------+---------+---------------+

    サンプルテーブルの順序を作成するSQL:

    1. SQLServerでGOTOを使用する方法

    2. T-SQLを使用したファジーマッチング

    3. SQLite Order By

    4. T-SQL火曜日#106:INSTEADOFトリガー