sql >> Database teknologi >  >> RDS >> Mysql

Beregn percentil fra seneste i MySQL

Nogle gange vil du måske beregne percentil fra seneste i MySQL baseret på. For eksempel at rangere kunder baseret på seneste køb eller ordre i stedet for det samlede salg. Dette hjælper med at skabe særlige tilbud til folk, der for nylig har købt noget på din hjemmeside. Der er endnu ingen funktioner til det. Her er en klar forespørgsel til at gøre det.

F.eks. har du et bord ordrer som indeholder alle produktordrer for hver bruger. Du ønsker at beregne percentilen ud fra de seneste ordrer.

percentiler+-----------+----------------+--------+------- --------+| bruger_id | seneste | rang | percentil |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33.33 |+-----------+----------------+--------+-------- -------+

Her er en forespørgsel, du kan bruge til at beregne percentil fra seneste i MySQL. Udskift blot kolonnerne – bruger_id, købsdato og tabel – ordre. Den får den seneste købsdato for hver bruger. Så rangerer den dem på seneste over købsdatoen. Til sidst beregner den percentil ved hjælp af rang.

vælg user_id  ,latest,rank,round(100*(cnt-rank+1)/cnt,0) som percentil fra (SELECT user_id,latest,@curRank :=@curRank + 1 AS rankFROM (vælg user_id  ,max(købsdato  ) senest fra `ordre  ` gruppe af user_id  )p, (SELECT @curRank :=0) rORDER BY latest desc ) as dt,(vælg count(distinct user_id  ) som cnt fra `ordre  `) som ct

Hvis du allerede har den seneste købsdato for hver bruger i tabellen og ønsker at bruge tabellen direkte til at beregne percentil fra købsnyhed, er her en forespørgsel

vælg user_id  ,purchase_date,rank,round(100*(cnt-rank+1)/cnt,0) som percentil fra (SELECT user_id,purchase_date,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY purchase_date desc ) as dt,(vælg count(distinct user_id  ) som cnt fra `ordre  `) som ct
percentiler+-----------+----------------+--------+------- --------+| bruger_id | købsdato| 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 sidst rangerede bruger ikke en nul-percentil. Dette er karakteren af ​​percentilberegning. Enten kan den første person have 100 percentil, eller den sidst rangerede kan have nul. Begge dele kan ikke ske på samme tid. Hvis du vil tvinge den sidst rangerede person til at have en nul-percentil, kan du bruge følgende forespørgsler. Jeg tilføjer ikke 1 til rangeringen, mens jeg beregner percentilen.

vælg user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) som percentil fra (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (vælg user_id>  ,count(salg  ) i alt fra `ordre  ` gruppe af user_id  )p, (SELECT @curRank :=0) rORDER BY total desc ) som dt,(vælg count(distinct user_id  ) som cnt fra `ordre  `) som ct

Hvis du allerede har samlet salg for hver bruger i tabellen og ønsker at bruge tabellen direkte til at beregne percentilen, er her en forespørgsel

vælg user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) som percentil fra (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY total desc ) som dt,(vælg count(distinct user_id  ) som cnt fra `ordre  `) som ct
percentiler
+-------+----------------+--------+------- --------+| bruger_id | købsdato| rang | percentil |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 66,67 || 4 | 2013-11-11 | 2 | 33.33 || 3 | 2013-10-20 | 3 | 0 |+-----------+----------------+--------+-------- -------+

SQL for at oprette eksempeltabelrækkefølgen:

  1. GROUP eller DISTINCT efter JOIN returnerer dubletter

  2. Oracle SQL-udvikler:Fejl - Test mislykkedes:Netværksadapteren kunne ikke etablere forbindelsen?

  3. Accelereret databasegendannelse i SQL Server 2019

  4. Den nemmeste måde at tilføje flere mellemrum til en streng i MySQL – SPACE()