sql >> Database >  >> RDS >> Mysql

Bereken percentiel in MySQL op basis van totalen

Het kan lastig zijn om het percentiel in MySQL te berekenen. Er zijn nog geen functies voor. Percentielen zijn handig om gebruikers of klanten te rangschikken en te groeperen.

U kunt uw meest waardevolle gebruikers of klanten identificeren en speciale aanbiedingen voor hen maken. 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 percentiel berekenen.

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

Hier is een query die u kunt gebruiken om het percentiel in MySQL te berekenen op basis van totalen. Vervang gewoon de kolommen - user_id, sales en table - order. Het aggregeert de totale verkoop voor elke gebruiker. Vervolgens rangschikt het ze op de totale verkoop. 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  ,sum(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+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 | 30 | 3 | 33.33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+-----------+----------+---------+-------------- -+

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

SQL om de voorbeeldtabelvolgorde te maken:

  1. MariaDB – MySQL – Toon motoren om alle beschikbare en ondersteunde motoren weer te geven

  2. JSON_DEPTH() – Vind de maximale diepte van een JSON-document in MySQL

  3. Is het mogelijk om toegang te krijgen tot een .mdf-database zonder SQL Server?

  4. Hoe installeer ik Oracle Instant Client op een Mac?