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

Oblicz percentyl w MySQL na podstawie sum

Obliczenie percentyla w MySQL może być trudne. Nie ma jeszcze do tego funkcji. Centyle są przydatne do oceniania i grupowania użytkowników lub klientów.

Możesz zidentyfikować swoich najcenniejszych użytkowników lub klientów i stworzyć dla nich specjalne oferty. 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.

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

Oto zapytanie, którego możesz użyć do obliczenia percentyla w MySQL na podstawie sum. Wystarczy wymienić kolumny – user_id, sales oraz table – order. Agreguje całkowitą sprzedaż dla każdego użytkownika. Następnie klasyfikuje je pod względem łącznej sprzedaży. 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  ,suma(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+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 | 30 || 4 | 100 || 3 | 200 |+---------------+----------+
percentyle+-----------+----------+------------+-------------- --+| identyfikator_użytkownika | łącznie | pozycja | percentyl |+-----------+----------+---------+--------------- -+| 1 | 30 | 3 | 33,33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+-----------+----------+---------+--------------- -+

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  ,suma(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 | 30 | 3 | 0 || 4 | 100 | 2 | 33,33 || 3 | 200 | 1 | 66,67 |+-----------+----------+---------+--------------- -+

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. Zwróć wiersz tylko wtedy, gdy wartość nie istnieje

  2. Jak mogę wysyłać zapytania między dwiema datami za pomocą MySQL?

  3. Jak używać GROUP BY do łączenia ciągów w MySQL?

  4. MySQL :nie znajduje się w GROUP BY

  5. DATEDIFF() Przykłady – MySQL