sql >> Database >  >> RDS >> Mysql

Bereken percentiel van frequentie in MySQL

Soms wilt u misschien percentiel berekenen op basis van frequentie of tellingen in MySQL op basis van. Bijvoorbeeld om klanten te rangschikken op basis van aantal aankopen of bestellingen in plaats van totale verkopen. Er zijn nog geen functies voor. Hier is een kant-en-klare vraag om het te doen.

U heeft bijvoorbeeld een tafel bestellingen die alle productbestellingen voor elke gebruiker bevat. U wilt het percentiel berekenen op basis van de frequentie van bestellingen.

percentielen+-----------+----------+---------+------------- --+| user_id | totaal | rang | percentiel |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33.33 |+-----------+----------+---------+-------------- -+

Hier is een zoekopdracht die u kunt gebruiken om het percentiel te berekenen op basis van frequentie of telling in MySQL. Vervang gewoon de kolommen - user_id, sales en table - order. Het telt het aantal bestellingen voor elke gebruiker. Vervolgens rangschikt het ze op aantal bestellingen. Ten slotte berekent het percentiel met behulp van rang.

selecteer user_id  ,total,rank,round(100*(cnt-rank+1)/cnt,0) als percentiel van (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (selecteer user_id  ,count(verkoop  ) als totaal van `bestelling  ` groeperen op user_id  )p, (SELECT @curRank :=0) rORDER BY totaal desc ) als dt,(select count(distinct user_id  ) als cnt van`bestelling  `) als ct

Als u al een aantal bestellingen heeft voor elke gebruiker in de tabel en u wilt de tabel rechtstreeks gebruiken om het percentiel te berekenen op basis van frequentie of telling, dan volgt hier een vraag

selecteer user_id  ,total,rank,round(100*(cnt-rank+1)/cnt,0) als percentiel van (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY totaal desc ) als dt,(select count(distinct user_id  ) als cnt van`bestelling  `) als ct
percentielen+-----------+----------+---------+------------- --+| user_id | totaal | rang | percentiel |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33.33 |+-----------+----------+---------+-------------- -+

Zoals u kunt zien, heeft de laatst gerangschikte gebruiker geen nulpercentiel. Dit is de aard van percentielberekening. Ofwel de eerste persoon kan 100 percentiel hebben of de laatst gerangschikte kan nul hebben. Beide kunnen niet tegelijkertijd gebeuren. Als u de laatst gerangschikte persoon wilt dwingen een nulpercentiel te hebben, kunt u de volgende query's gebruiken. Ik voeg geen 1 toe aan de rangorde tijdens het berekenen van het percentiel.

selecteer user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) als percentiel van (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (selecteer user_id  ,count(verkoop  ) als totaal van `bestelling  ` groeperen op user_id  )p, (SELECT @curRank :=0) rORDER BY totaal desc ) als dt,(select count(distinct user_id  ) als cnt van`bestelling  `) als ct

Als u al de totale verkoop voor elke gebruiker in de tabel heeft en de tabel rechtstreeks wilt gebruiken om het percentiel te berekenen, volgt hier een vraag

selecteer user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) als percentiel van (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY totaal desc ) als dt,(select count(distinct user_id  ) als cnt van`bestelling  `) als ct
percentielen+-----------+----------+---------+------------- --+| user_id | totaal | rang | percentiel |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33.33 || 3 | 1 | 3 | 0 |+-----------+----------+---------+-------------- -+

SQL om de voorbeeldtabelvolgorde te maken:

  1. Oracle Dynamic Pivoting

  2. Hoe verander ik het datumformaat van MM/DD/YYYY naar YYYY-MM-DD in PL/SQL?

  3. Hoe een Excel-bestand te importeren in een MySQL-database

  4. Controleer of een tabel wordt verwezen door een externe sleutel in SQL Server met OBJECTPROPERTY()