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

Beregn percentil i MySQL baseret på totaler

Det kan være besværligt at beregne percentil i MySQL. Der er endnu ingen funktioner til det. Percentiler er nyttige til at rangere og gruppere brugere eller kunder.

Du kan identificere dine mest værdifulde brugere eller kunder og oprette særlige tilbud til dem. 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 vil beregne percentil.

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

Her er en forespørgsel, du kan bruge til at beregne percentil i MySQL baseret på totaler. Udskift blot kolonnerne – bruger_id, salg og tabel – rækkefølge. Den samler det samlede salg for hver bruger. Så rangerer den dem på det samlede salg. 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  ,sum(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+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 | 30 | 3 | 33.33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+------------+------------------- -+

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

SQL for at oprette eksempeltabelrækkefølgen:

  1. Brug af Jenkins med Kubernetes AWS, del 3

  2. Hvordan listes tilgængelige forekomster af SQL-servere ved hjælp af SMO i C#?

  3. Sådan fungerer CHAR_LENGTH() i MariaDB

  4. Forbindelsen mislykkedes:Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:JA) fra php-funktionen