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

Beregn percentil fra frekvens i MySQL

Nogle gange vil du måske beregne percentil ud fra frekvens eller tællinger i MySQL baseret på. For eksempel at rangere kunder baseret på antal køb eller ordrer i stedet for samlet salg. Der er ingen funktioner til det endnu. 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 frekvensen af ​​ordrer.

percentiler+------------+--------+--------+------------- --+| bruger_id | i alt | rang | percentil |+-----------+----------+--------+------------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+------------------- -+

Her er en forespørgsel, du kan bruge til at beregne percentil fra frekvens eller optælling i MySQL. Udskift blot kolonnerne – bruger_id, salg og tabel – rækkefølge. Den tæller antallet af ordrer for hver bruger. Derefter rangerer den dem efter antal ordrer. Til sidst beregner den percentil ved hjælp af rang.

vælg user_id  ,total,rank,round(100*(cnt-rank+1)/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 antallet af ordrer for hver bruger i tabellen og ønsker at bruge tabellen direkte til at beregne percentil ud fra frekvens eller antal, er her en forespørgsel

vælg user_id  ,total,rank,round(100*(cnt-rank+1)/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 | i alt | rang | percentil |+-----------+----------+--------+------------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 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 | i alt | rang | percentil |+-----------+----------+--------+------------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33.33 || 3 | 1 | 3 | 0 |+-------------------------------- -+

SQL for at oprette eksempeltabelrækkefølgen:

  1. JSON_OBJECT() Funktion i Oracle

  2. Ukendt kolonne i 'feltliste'-fejl på MySQL Update-forespørgsel

  3. FEJL 2002 (HY000):Kan ikke oprette forbindelse til den lokale MySQL-server via socket '/var/run/mysqld/mysqld.sock' (2)

  4. Præstationsoverraskelser og antagelser:GRUPPE EFTER vs. DISTINCT