sql >> Databasteknik >  >> RDS >> Mysql

Beräkna percentilen i MySQL baserat på totaler

Det kan vara jobbigt att beräkna percentilen i MySQL. Det finns inga funktioner för det ännu. Percentiler är användbara för att rangordna och gruppera användare eller kunder.

Du kan identifiera dina mest värdefulla användare eller kunder och skapa specialerbjudanden för dem. 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.

beställ+-----------+------------+----------+| user_id | produkt | försäljning |+-----------+------------+--------+| 1 | Tvål | 10 || 4 | Parfym | 100 || 1 | Nudlar | 20 || 3 | Deo | 200 |+------------+------------+---------+
percentiler+-----------+--------+--------+------------- --+| user_id | totalt | rang | percentil |+-----------+--------+--------+-------------------- -+| 1 | 30 | 3 | 33.33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+-----------+-----------+--------+---------------- -+

Här är en fråga du kan använda för att beräkna percentilen i MySQL baserat på totaler. Byt bara ut kolumnerna – user_id, sales och table – order. Den sammanställer den totala försäljningen för varje användare. Sedan rankar den dem på den totala försäljningen. Slutligen beräknar den percentilen med hjälp av rang.

välj user_id  ,total,rank,round(100*(cnt-rank+1)/cnt,0) som percentil från (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (välj user_id  ,sum(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+1)/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
beställ+-----------+----------+| user_id | totalt |+-----------+----------+| 1 | 30 || 4 | 100 || 3 | 200 |+-----------+----------+
percentiler+-----------+--------+--------+------------- --+| user_id | totalt | rang | percentil |+-----------+--------+--------+-------------------- -+| 1 | 30 | 3 | 33.33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+-----------+-----------+--------+---------------- -+

Som du kan se har den senast rankade användaren ingen 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>  ,sum(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 | totalt | rang | percentil |+-----------+--------+--------+-------------------- -+| 1 | 30 | 3 | 0 || 4 | 100 | 2 | 33.33 || 3 | 200 | 1 | 66,67 |+------------+--------+--------+------------- -+

SQL för att skapa exempeltabellordningen:

  1. Hur man tar bort ledande blanksteg i SQL Server – LTRIM()

  2. Hur påverkar NULL-värden prestanda i en databassökning?

  3. PostgreSQL - GROUP BY-sats eller användas i en aggregerad funktion

  4. Nya kolumnändringar endast för metadata i SQL Server 2016