Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hitung persentil dari frekuensi di MySQL

Terkadang Anda mungkin ingin menghitung persentil dari frekuensi atau hitungan di MySQL berdasarkan. Misalnya, untuk menentukan peringkat pelanggan berdasarkan jumlah pembelian atau pesanan alih-alih total penjualan. 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 frekuensi pesanan.

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     |
+-----------+----------+---------+---------------+

Berikut adalah kueri yang dapat Anda gunakan untuk menghitung persentil dari frekuensi atau hitungan di MySQL. Ganti saja kolom – user_id, sales dan table – order. Ini menghitung jumlah pesanan untuk setiap pengguna. Kemudian peringkat mereka pada jumlah pesanan. Terakhir, ia menghitung persentil menggunakan peringkat.

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

Jika Anda sudah memiliki jumlah pesanan untuk setiap pengguna dalam tabel dan ingin langsung menggunakan tabel untuk menghitung persentil dari frekuensi atau hitungan, berikut adalah kuerinya

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     |
+-----------+----------+---------+---------------+

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  |   total  |  rank   |   percentile  |
+-----------+----------+---------+---------------+
|     1     |    3     |    1    |     66.67     |
|     4     |    2     |    2    |     33.33     |
|     3     |    1     |    3    |       0       |
+-----------+----------+---------+---------------+

SQL untuk membuat urutan tabel sampel:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak ditemukan driver yang cocok untuk 'jdbc:mysql://localhost:3306/mysql

  2. Membangun kembali Budak Replikasi MySQL 8.0 Menggunakan Plugin Klon

  3. PHP menampilkan gambar BLOB dari MySQL

  4. Mengatur Django untuk menggunakan MySQL

  5. Pengantar SQL Bergabung