sql >> Database >  >> RDS >> Mysql

Bereken percentiel van recentheid in MySQL

Soms wilt u misschien percentiel berekenen van recentheid in MySQL op basis van. Bijvoorbeeld om klanten te rangschikken op basis van recentheid van aankopen of bestellingen in plaats van totale verkopen. Dit helpt bij het creëren van speciale aanbiedingen voor mensen die onlangs iets op uw website hebben gekocht. 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 percentiel berekenen op basis van recentheid van bestellingen.

percentielen+-----------+----------------+---------+------- --------+| user_id | laatste | rang | percentiel |+-----------+----------------+---------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33.33 |+-----------+----------------+---------+-------- -------+

Hier is een query die u kunt gebruiken om het percentiel te berekenen op basis van recentheid in MySQL. Vervang gewoon de kolommen - user_id, purchase_date en table - order. Het krijgt de laatste aankoopdatum van elke gebruiker. Vervolgens rangschikt het ze op de laatste over de datum van aankoop. Ten slotte berekent het percentiel met behulp van rang.

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

Als u al de laatste aankoopdatum voor elke gebruiker in de tabel heeft en de tabel rechtstreeks wilt gebruiken om het percentiel te berekenen op basis van de recentheid van de aankoop, volgt hier een vraag

selecteer user_id  ,purchase_date,rank,round(100*(cnt-rank+1)/cnt,0) als percentiel van (SELECT user_id,purchase_date,@curRank :=@curRank + 1 AS rankFROM `order`  p, (SELECT @curRank :=0) rORDER BY purchase_date desc ) als dt,(select count(distinct user_id  ) als cnt van`bestelling  `) als ct
bestellen+-----------+----------------+---------+------- --------+| user_id | aankoopdatum| rang | percentiel |+-----------+----------------+---------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33.33 |+-----------+----------------+---------+-------- -------+
percentielen+-----------+----------------+---------+------- --------+| user_id | aankoopdatum| rang | percentiel |+-----------+----------------+---------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 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 | aankoopdatum| rang | percentiel |+-----------+----------------+---------+-------- -------+| 1 | 2013-11-20 | 1 | 66,67 || 4 | 2013-11-11 | 2 | 33.33 || 3 | 2013-10-20 | 3 | 0 |+-----------+----------------+---------+-------- -------+

SQL om de voorbeeldtabelvolgorde te maken:

  1. gegevens van de ene tabel naar de andere verplaatsen, postgresql-editie

  2. Hoe Odoo 12 te clusteren met PostgreSQL-streamingreplicatie voor hoge beschikbaarheid

  3. Entity Framework en meerdere schema's

  4. SQL Server:Indexkolommen gebruikt in like?