sql >> Databasteknik >  >> RDS >> Mysql

Beräkna percentil från senaste i MySQL

Ibland kanske du vill beräkna percentil från senaste i MySQL baserat på. Till exempel att rangordna kunder baserat på senaste köp eller beställningar istället för total försäljning. Detta hjälper till att skapa specialerbjudanden för personer som nyligen har köpt något på din webbplats. Det finns inga funktioner för det ännu. Här är en färdig fråga för att göra det.

Du har t.ex. bordsbeställningar som innehåller alla produktbeställningar för varje användare. Du vill beräkna percentilen från beställningars senaste datum.

beställ+-----------+------------+----------------+| user_id | produkt | köpdatum |+-----------+------------+-----------------+| 1 | Tvål | 2013-11-20 || 4 | Parfym | 2013-07-02 || 1 | Nudlar | 2013-10-20 || 4 | Tvål | 2013-11-11 || 1 | Lim | 2013-09-12 || 3 | Deo | 2013-10-20 |+------------+------------+------------------------ +
percentiler+-----------+----------------+--------+------- --------+| user_id | senaste | rang | percentil |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33.33 |+-----------+----------------+--------+-------- -------+

Här är en fråga som du kan använda för att beräkna percentil från senaste i MySQL. Byt bara ut kolumnerna – user_id, purchase_date och table – order. Den får det senaste köpdatumet för varje användare. Sedan rangordnas dem efter senaste inköpsdatum. Slutligen beräknar den percentilen med hjälp av rang.

välj user_id  ,senaste,rank,runda(100*(cnt-rank+1)/cnt,0) som percentil från (SELECT user_id,latest,@curRank :=@curRank + 1 AS rankFROM (välj user_id  ,max(köpdatum  ) senast från `beställning  ` grupp av user_id  )p, (SELECT @curRank :=0) rORDER BY senaste desc ) som dt,(välj count(distinct user_id  ) som cnt från `order  `) som ct

Om du redan har senaste inköpsdatum för varje användare i tabellen och vill använda tabellen direkt för att beräkna percentilen från köpets senaste inköpsdatum, här är en fråga

välj user_id  ,purchase_date,rank,round(100*(cnt-rank+1)/cnt,0) som percentil från (SELECT user_id,purchase_date,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY purchase_date desc ) as dt,(select count(distinct user_id  ) som cnt från `order  `) som ct
beställ+-----------+----------------+--------+------- --------+| user_id | köpdatum| rang | percentil |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33.33 |+-----------+----------------+--------+-------- -------+
percentiler+-----------+----------------+--------+------- --------+| user_id | köpdatum| rang | percentil |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33.33 |+-----------+----------------+--------+-------- -------+

Som du kan se har den senast rankade användaren inte en nollpercentil. Detta är typen av percentilberäkning. Antingen kan den första personen ha 100 percentil eller den sist rankade kan ha noll. Båda kan inte hända samtidigt. Om du vill tvinga den senast rankade personen att ha en nollpercentil kan du använda följande frågor. Jag lägger inte till 1 till rangordningen när jag beräknar percentilen.

välj user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) som percentil från (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (välj user_id>  ,count(försäljning  ) totalt från `order  ` grupp av user_id  )p, (SELECT @curRank :=0) rORDER BY total desc ) som dt,(select count(distinct user_id  ) som cnt från `order  `) som ct

Om du redan har total försäljning för varje användare i tabellen och vill använda tabellen direkt för att beräkna percentilen, här är en fråga

välj user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) som percentil från (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY total desc ) som dt,(select count(distinct user_id  ) som cnt från `order  `) som ct
percentiler
+-----------+----------------+--------+------- --------+| user_id | köpdatum| rang | percentil |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 66,67 || 4 | 2013-11-11 | 2 | 33.33 || 3 | 2013-10-20 | 3 | 0 |+-----------+----------------+--------+-------- -------+

SQL för att skapa exempeltabellordningen:

  1. Letar du efter en enkel fulltextsökning? Prova MySQL InnoDB + CakePHP med Word Stemming

  2. 2 sätt att returnera rader som innehåller icke-alfanumeriska tecken i PostgreSQL

  3. Pearsons korrelationskoefficientformel i SQL

  4. Det gick inte att ladda DLL "OraOps10.dll"