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

MySQLの最新性からパーセンタイルを計算する

    に基づいてMySQLの最新性からパーセンタイルを計算したい場合があります。たとえば、総売上高ではなく、購入または注文の最新性に基づいて顧客をランク付けします。これは、最近Webサイトで何かを購入した人に特別オファーを作成するのに役立ちます。そのための機能はまだありません。これを行うための既製のクエリがあります。

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

    order
    +-----------+------------+------------------+
    |  user_id  |   product  |   purchase_date  |
    +-----------+------------+------------------+
    |     1     |     Soap   |     2013-11-20   |
    |     4     |   Perfume  |     2013-07-02   |
    |     1     |   Noodles  |     2013-10-20   |
    |     4     |     Soap   |     2013-11-11   |
    |     1     |    Glue    |     2013-09-12   |
    |     3     |     Deo    |     2013-10-20   |
    +-----------+------------+------------------+
    percentiles
    +-----------+----------------+---------+---------------+
    |  user_id  |   latest       |  rank   |   percentile  |
    +-----------+----------------+---------+---------------+
    |     1     |  2013-11-20    |    1    |      100      |
    |     4     |  2013-11-11    |    2    |     66.67     |
    |     3     |  2013-10-20    |    3    |     33.33     |
    +-----------+----------------+---------+---------------+

    これは、MySQLの最新性からパーセンタイルを計算するために使用できるクエリです。列(user_id、purchase_date、table)を置き換えるだけです。各ユーザーの最新の購入日を取得します。次に、購入日の最新のものにランク付けします。最後に、ランクを使用してパーセンタイルを計算します。

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

    テーブル内の各ユーザーの最新の購入日がすでにあり、テーブルを直接使用して購入の最新性からパーセンタイルを計算する場合は、ここにクエリがあります

    select user_id,purchase_date,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from   
    (SELECT  user_id,purchase_date,@curRank := @curRank + 1 AS rank
    FROM   `order`
    p, (SELECT @curRank := 0) r
    ORDER BY  purchase_date desc ) as dt,(select count(distinct user_id) as cnt from
    `order`) as ct
    order
    +-----------+----------------+---------+---------------+
    |  user_id  |   purchase_date|  rank   |   percentile  |
    +-----------+----------------+---------+---------------+
    |     1     |  2013-11-20    |    1    |      100      |
    |     4     |  2013-11-11    |    2    |     66.67     |
    |     3     |  2013-10-20    |    3    |     33.33     |
    +-----------+----------------+---------+---------------+
    percentiles
    +-----------+----------------+---------+---------------+
    |  user_id  |   purchase_date|  rank   |   percentile  |
    +-----------+----------------+---------+---------------+
    |     1     |  2013-11-20    |    1    |      100      |
    |     4     |  2013-11-11    |    2    |     66.67     |
    |     3     |  2013-10-20    |    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  |   purchase_date|  rank   |   percentile  |
    +-----------+----------------+---------+---------------+
    |     1     |  2013-11-20    |    1    |     66.67     |
    |     4     |  2013-11-11    |    2    |     33.33     |
    |     3     |  2013-10-20    |    3    |       0       |
    +-----------+----------------+---------+---------------+

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

    1. ルールまたは通知を使用してマテリアライズドビューを自動的に更新します

    2. PostgreSQLbytea列の16進数をrのint16/uint16にデコードする方法は?

    3. 多言語データベース設計のベストプラクティス

    4. JDBC PreparedStatementでLIKEクエリを使用できませんか?