Terkadang Anda mungkin ingin menghitung persentil dari keterkinian di MySQL berdasarkan. Misalnya, untuk memberi peringkat pelanggan berdasarkan pembelian atau pesanan terbaru, bukan total penjualan. Ini membantu membuat penawaran khusus untuk orang yang baru saja membeli sesuatu di situs web Anda. Belum ada fungsi untuk itu. Ini kueri yang sudah jadi untuk melakukannya.
Misalnya, Anda memiliki tabel pesanan yang berisi semua pesanan produk untuk setiap pengguna. Anda ingin menghitung persentil dari keterkinian pesanan.
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 | +-----------+----------------+---------+---------------+
Berikut kueri yang dapat Anda gunakan untuk menghitung persentil dari keterkinian di MySQL. Ganti saja kolom – user_id, purchase_date dan table – order. Itu mendapat tanggal pembelian terbaru setiap pengguna. Kemudian peringkat mereka pada tanggal pembelian terakhir. Terakhir, ia menghitung persentil menggunakan peringkat.
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
Jika Anda sudah memiliki tanggal pembelian terakhir untuk setiap pengguna dalam tabel dan ingin langsung menggunakan tabel tersebut untuk menghitung persentil dari kebaruan pembelian, berikut adalah kuerinya
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 | +-----------+----------------+---------+---------------+
Seperti yang Anda lihat, pengguna peringkat terakhir tidak memiliki persentil nol. Ini adalah sifat perhitungan persentil. Baik orang pertama dapat memiliki 100 persentil atau peringkat terakhir dapat memiliki nol. Keduanya tidak bisa terjadi secara bersamaan. Jika Anda ingin memaksa orang dengan peringkat terakhir untuk memiliki persentil nol, Anda dapat menggunakan kueri berikut. Saya tidak menambahkan 1 ke peringkat saat menghitung persentil.
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
Jika Anda sudah memiliki total penjualan untuk setiap pengguna dalam tabel dan ingin langsung menggunakan tabel tersebut untuk menghitung persentil, berikut kuerinya
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 untuk membuat urutan tabel sampel: