sql >> Databáze >  >> RDS >> Mysql

Vypočítejte percentil z frekvence v MySQL

Někdy možná budete chtít vypočítat percentil z frekvence nebo počtů v MySQL na základě. Např. seřadit zákazníky podle počtu nákupů nebo objednávek namísto celkového prodeje. Zatím pro to nejsou žádné funkce. Zde je připravený dotaz, jak to udělat.

Např. máte tabulku objednávky který obsahuje všechny objednávky produktů pro každého uživatele. Chcete vypočítat percentil z frekvence objednávek.

percentily+-----------+----------+---------+------------- --+| user_id | celkem | hodnost | percentil |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+----------+---------+--------------- -+

Zde je dotaz, který můžete použít k výpočtu percentilu z frekvence nebo počtu v MySQL. Stačí nahradit sloupce – user_id, sales a table – order. Počítá počet objednávek pro každého uživatele. Poté je seřadí podle počtu objednávek. Nakonec vypočítá percentil pomocí hodnocení.

vyberte user_id  ,total,rank,round(100*(cnt-rank+1)/cnt,0) jako percentil z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (vyberte user_id  ,count(prodej  ) jako součet z `objednávky  ` seskupit podle user_id  )p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) jako cnt z`objednávky  `) jako ct

Pokud již máte v tabulce počet objednávek pro každého uživatele a chcete přímo použít tabulku k výpočtu percentilu z frekvence nebo počtu, zde je dotaz

vyberte user_id  ,total,rank,round(100*(cnt-rank+1)/cnt,0) jako percentil z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `pořadí`  p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) jako cnt z`objednávky  `) jako ct
percentily+-----------+----------+---------+------------- --+| user_id | celkem | hodnost | percentil |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+----------+---------+--------------- -+

Jak vidíte, poslední hodnocený uživatel nemá nulový percentil. To je povaha výpočtu percentilu. Buď první osoba může mít 100 percentil, nebo poslední hodnocená může mít nulu. Obojí se nemůže stát současně. Pokud chcete přinutit poslední hodnocenou osobu, aby měla nulový percentil, můžete použít následující dotazy. Při výpočtu percentilu nepřidávám 1 k hodnocení.

vyberte user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) jako percentil z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (vyberte user_id  ,count(prodej  ) jako součet z `objednávky  ` seskupit podle user_id  )p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) jako cnt z`objednávky  `) jako ct

Pokud již máte celkové prodeje pro každého uživatele v tabulce a chcete přímo použít tabulku k výpočtu percentilu, zde je dotaz

vyberte user_id  ,total,rank,round(100*(cnt-rank)/cnt,0) jako percentil z (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM `pořadí`  p, (SELECT @curRank :=0) rORDER BY total desc ) as dt,(select count(distinct user_id  ) jako cnt z`objednávky  `) jako ct
percentily+-----------+----------+---------+------------- --+| user_id | celkem | hodnost | percentil |+-----------+----------+---------+-------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33,33 || 3 | 1 | 3 | 0 |+-----------+----------+---------+-------------- -+

SQL pro vytvoření ukázkové objednávky tabulky:

  1. jak obnovit pohotovostní databázi z chybějícího archivního protokolu

  2. Ukázková schémata na GitHubu

  3. Nulové zablokování SQL podle návrhu – nějaké vzory kódování?

  4. Funkce RAWTOHEX() v Oracle