sql >> Databasteknik >  >> RDS >> Mysql

Beräkna percentil från frekvens i MySQL

Ibland kanske du vill beräkna percentil från frekvens eller räkningar i MySQL baserat på. Till exempel att rangordna kunder baserat på antal köp eller beställningar istället för total försäljning. 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 frekvens.

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

Här är en fråga du kan använda för att beräkna percentil från frekvens eller räkning i MySQL. Byt bara ut kolumnerna – user_id, sales och table – order. Den räknar antalet beställningar för varje användare. Sedan rangordnas dem efter antal beställningar. 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  ,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 antal beställningar för varje användare i tabellen och vill använda tabellen direkt för att beräkna percentil från frekvens eller antal, 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 | 3 || 4 | 2 || 3 | 1 |+-----------+----------+
percentiler+-----------+--------+--------+------------- --+| user_id | totalt | rang | percentil |+-----------+--------+--------+-------------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33.33 |+------------+--------+--------+------------- -+

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>  ,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 | totalt | rang | percentil |+-----------+--------+--------+-------------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33.33 || 3 | 1 | 3 | 0 |+-----------+-----------+--------+------------------- -+

SQL för att skapa exempeltabellordningen:

  1. Arbeta med triggers i en MySQL-databas - en handledning

  2. Hur man optimerar COUNT(*) prestanda på InnoDB genom att använda index

  3. Konstigt SQLAlchemy-felmeddelande:TypeError:'dict'-objekt stöder inte indexering

  4. Skapa en SQL Server-databas med SQLOPS