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

合計に基づいてMySQLのパーセンタイルを計算します

    MySQLでパーセンタイルを計算するのは面倒な場合があります。そのための機能はまだありません。パーセンタイルは、ユーザーまたは顧客をランク付けおよびグループ化するのに役立ちます。

    最も価値のあるユーザーまたは顧客を特定し、それらの特別オファーを作成できます。これを行うための既製のクエリがあります。

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

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

    合計に基づいて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,sum(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     |    30    |
    |     4     |   100    |
    |     3     |   200    |
    +-----------+----------+
    percentiles
    +-----------+----------+---------+---------------+
    |  user_id  |   total  |  rank   |   percentile  |
    +-----------+----------+---------+---------------+
    |     1     |    30    |    3    |     33.33     |
    |     4     |   100    |    2    |     66.67     |
    |     3     |   200    |    1    |     100       |
    +-----------+----------+---------+---------------+

    ご覧のとおり、最後にランク付けされたユーザーのパーセンタイルはゼロではありません。これがパーセンタイル計算の性質です。最初の人が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,sum(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     |    30    |    3    |        0      |
    |     4     |   100    |    2    |     33.33     |
    |     3     |   200    |    1    |     66.67     |
    +-----------+----------+---------+---------------+

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

    1. 複数のID値を受け入れるT-SQLストアドプロシージャ

    2. SQLで生年月日から年齢を計算する方法

    3. MySQLで2つの日時の差を計算する

    4. TimescaleDBの高度なデータベース監視と管理