Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Oblicz percentyl na podstawie częstotliwości w MySQL

Czasami możesz chcieć obliczyć percentyl na podstawie częstotliwości lub liczebności w MySQL. Np. aby uszeregować klientów na podstawie liczby zakupów lub zamówień zamiast łącznej sprzedaży. Nie ma jeszcze do tego funkcji. Oto gotowe zapytanie, aby to zrobić.

Np. Masz stół zamówienia który zawiera wszystkie zamówienia produktów dla każdego użytkownika. Chcesz obliczyć percentyl na podstawie częstotliwości zamówień.

zamówienie+------+--------------+-------------+| identyfikator_użytkownika | produkt | sprzedaż |+-----------+------------+----------+| 1 | Mydło | 10 || 4 | Perfumy | 100 || 1 | Makaron | 20 || 4 | Mydło | 10 || 1 | Klej | 20 || 3 | Deo | 200 |+---------------+------------+----------+
percentyle+-----------+----------+------------+-------------- --+| identyfikator_użytkownika | łącznie | pozycja | percentyl |+-----------+----------+---------+--------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+----------+------------+--------------- -+

Oto zapytanie, którego możesz użyć do obliczenia percentyla na podstawie częstotliwości lub liczby w MySQL. Wystarczy wymienić kolumny – user_id, sales oraz table – order. Zlicza ilość zamówień dla każdego użytkownika. Następnie klasyfikuje je według liczby zamówień. Na koniec oblicza percentyl na podstawie rangi.

wybierz identyfikator_użytkownika  ,total,rank,round(100*(cnt-rank+1)/cnt,0) jako percentyl z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (wybierz user_id  ,hrabia(sprzedaż  ) jako całość z `zamówienia  ` grupuj według identyfikator_użytkownika  )p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id)  ) jako cnt z`zamówienie  `) jako ct

Jeśli masz już liczbę zamówień dla każdego użytkownika w tabeli i chcesz bezpośrednio użyć tabeli do obliczenia percentyla na podstawie częstotliwości lub liczby, oto zapytanie

wybierz identyfikator_użytkownika  ,total,rank,round(100*(cnt-rank+1)/cnt,0) jako percentyl z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `zamówienie`  p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) jako cnt z`zamówienie  `) jako ct
zamówienie+-----------+----------+| identyfikator_użytkownika | łącznie |+-----------+----------+| 1 | 3 || 4 | 2 || 3 | 1 |+---------------+----------+
percentyle+-----------+----------+------------+-------------- --+| identyfikator_użytkownika | łącznie | pozycja | percentyl |+-----------+----------+---------+--------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+----------+------------+--------------- -+

Jak widać, ostatni w rankingu użytkownik nie ma zerowego percentyla. Taka jest natura obliczania percentyla. Albo pierwsza osoba może mieć 100 percentyl, albo ostatnia osoba w rankingu może mieć zero. Jedno i drugie nie może się zdarzyć w tym samym czasie. Jeśli chcesz zmusić ostatnią osobę w rankingu do zerowego percentyla, możesz użyć następujących zapytań. Nie dodaję 1 do rangi podczas obliczania percentyla.

wybierz identyfikator_użytkownika  ,total,rank,round(100*(cnt-rank)/cnt,0) jako percentyl z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (wybierz user_id  ,hrabia(sprzedaż  ) jako całość z `zamówienia  ` grupuj według identyfikator_użytkownika  )p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id)  ) jako cnt z`zamówienie  `) jako ct

Jeśli masz już całkowitą sprzedaż dla każdego użytkownika w tabeli i chcesz bezpośrednio użyć tabeli do obliczenia percentyla, oto zapytanie

wybierz identyfikator_użytkownika  ,total,rank,round(100*(cnt-rank)/cnt,0) jako percentyl z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `zamówienie`  p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) jako cnt z`zamówienie  `) jako ct
percentyle+-----------+----------+------------+-------------- --+| identyfikator_użytkownika | łącznie | pozycja | percentyl |+-----------+----------+---------+--------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33,33 || 3 | 1 | 3 | 0 |+-----------+----------+---------+--------------- -+

SQL, aby utworzyć przykładową kolejność tabel:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dziwne zachowanie duplikatów z GROUP_CONCAT dwóch LEFT JOIN z GROUP_BYs

  2. Tworzenie aplikacji internetowej od podstaw przy użyciu Python Flask i MySQL:część 2

  3. Składnia SQL CREATE TABLE – wymieniona przez DBMS

  4. Jak zainstalować MySQL na macOS

  5. Przywracanie usuniętego użytkownika „root” i hasła do MySQL