に基づいて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: