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

Oblicz percentyl na podstawie ostatnich dni w MySQL

Czasami możesz chcieć obliczyć percentyl na podstawie ostatnich w MySQL. Np. aby uszeregować klientów na podstawie ostatnich zakupów lub zamówień zamiast całkowitej sprzedaży. Pomaga to tworzyć specjalne oferty dla osób, które niedawno kupiły coś w Twojej witrynie. 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 ostatnich zamówień.

zamówienie+-----------+-------------+----------------------+| identyfikator_użytkownika | produkt | data_zakupu |+-----------+-------------+----------------------+| 1 | Mydło | 2013-11-20 || 4 | Perfumy | 2013-07-02 || 1 | Makaron | 2013-10-20 || 4 | Mydło | 2013-11-11 || 1 | Klej | 2013-09-12 || 3 | Deo | 2013-10-20 |+-----------+--------------+----------------------- +
percentyle+-----------+-----+-------------+----------- --------+| identyfikator_użytkownika | najnowszy | pozycja | percentyl |+-----------+----------------+---------+------------ -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33,33 |+-----------+----------------+---------+--------- -------+

Oto zapytanie, którego możesz użyć do obliczenia percentyla na podstawie ostatnich czasów w MySQL. Wystarczy zamienić kolumny – user_id, purchase_date i table – order. Pobiera najnowszą datę zakupu każdego użytkownika. Następnie klasyfikuje je według najpóźniejszej daty zakupu. Na koniec oblicza percentyl na podstawie rangi.

wybierz identyfikator_użytkownika  ,latest,rank,round(100*(cnt-rank+1)/cnt,0) jako percentyl z (SELECT user_id,latest,@curRank :=@curRank + 1 AS rankFROM (wybierz user_id  ,max(data_zakupu  ) najpóźniej z `zamówienia  ` grupuj według identyfikator_użytkownika  )p, (SELECT @curRank :=0) rORDER BY najnowszy opis ) as dt,(select count(distinct user_id  ) jako cnt z`zamówienie  `) jako ct

Jeśli masz już ostatnią datę zakupu dla każdego użytkownika w tabeli i chcesz bezpośrednio użyć tabeli do obliczenia percentyla na podstawie ostatnich zakupów, oto zapytanie

wybierz identyfikator_użytkownika  ,data_zakupu,rank,round(100*(cnt-rank+1)/cnt,0) jako percentyl z (SELECT user_id,purchase_date,@curRank :=@curRank + 1 AS rankFROM `zamówienie`  p, (SELECT @curRank :=0) rORDER BY data_zakupu desc ) as dt,(wybierz count(distinct identyfikator_użytkownika  ) jako cnt z`zamówienie  `) jako ct
zamówienie+-----------+----------------+---------+----------- --------+| identyfikator_użytkownika | data_zakupu| pozycja | percentyl |+-----------+----------------+---------+------------ -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33,33 |+-----------+----------------+---------+--------- -------+
percentyle+-----------+-----+-------------+----------- --------+| identyfikator_użytkownika | data_zakupu| pozycja | percentyl |+-----------+----------------+---------+------------ -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 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
centyle
+-----------+----------------+---------+----------- --------+| identyfikator_użytkownika | data_zakupu| pozycja | percentyl |+-----------+----------------+---------+------------ -------+| 1 | 2013-11-20 | 1 | 66,67 || 4 | 2013-11-11 | 2 | 33,33 || 3 | 2013-10-20 | 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. Jak znaleźć wartości nieliczbowe w kolumnie w MySQL?

  2. wygeneruj dni z zakresu dat

  3. Składnia SQL DROP TABLE — wymienione przez DBMS

  4. Uzyskaj różnicę lat między dwiema datami w MySQL jako liczbę całkowitą

  5. DATE_ADD() Przykłady – MySQL