Понякога може да искате да изчислите процентил от честотата или броя в MySQL въз основа на. Например, за класиране на клиентите въз основа на броя покупки или поръчки вместо общите продажби. Все още няма функции за това. Ето готова заявка, за да го направите.
Напр. имате таблина поръчка който съдържа всички поръчки на продукти за всеки потребител. Искате да изчислите процентил от честотата на поръчките.
<предварителна>поръчка+------+--------------+------------+| потребителски_идентификатор | продукт | продажби |+-----------+------------+----------+| 1 | Сапун | 10 || 4 | Парфюм | 100 || 1 | Юфка | 20 || 4 | Сапун | 10 || 1 | Лепило | 20 || 3 | Део | 200 |+-----------+------------+----------+перцентили+-----------+---------+--------+------------ --+| потребителски_идентификатор | общо | ранг | процентил |+-----------+-----------+--------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+---------+--------+-------------- -+
Ето заявка, която можете да използвате за изчисляване на процентил от честота или броене в MySQL. Просто заменете колоните – user_id, sales и table – поръчка. Той отчита броя на поръчките за всеки потребител. След това ги класира по брой поръчки. Накрая изчислява процентил, използвайки ранг.
изберете user_id ,total,rank,round(100*(cnt-rank+1)/cnt,0) като процентил от (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (изберете user_id ,count(продажби ) като общо от `поръчка ` група по user_id )p, (SELECT @curRank :=0) rORDER BY total desc ) като dt,(изберете брой(отличен user_id) ) като cnt от`поръчка `) като ct
Ако вече имате брой поръчки за всеки потребител в таблицата и искате директно да използвате таблицата за изчисляване на процентил от честотата или броя, ето заявка
изберете user_id ,total,rank,round(100*(cnt-rank+1)/cnt,0) като процентил от (SELECT user_id,total,@curRank :=@curRank + 1 КАТО рангFROM `order` p, (SELECT @curRank :=0) rORDER BY total desc ) като dt,(изберете брой(отличен user_id) ) като cnt от`поръчка `) като ct<предварителна>поръчка+-----------+---------+| потребителски_идентификатор | общо |+-----------+----------+| 1 | 3 || 4 | 2 || 3 | 1 |+----------+----------+
перцентили+-----------+---------+--------+------------ --+| потребителски_идентификатор | общо | ранг | процентил |+-----------+-----------+--------+-------------- -+| 1 | 3 | 1 | 100 || 4 | 2 | 2 | 66,67 || 3 | 1 | 3 | 33,33 |+-----------+---------+--------+-------------- -+
Както можете да видите, последният класиран потребител няма нулев процентил. Това е естеството на изчислението на процентил. Или първият човек може да има 100 процентил, или последният класиран може да има нула. И двете не могат да се случат едновременно. Ако искате да принудите последния класиран човек да има нулев процентил, можете да използвате следните заявки. Не добавям 1 към ранга, докато изчислявам процентил.
изберете user_id ,total,rank,round(100*(cnt-rank)/cnt,0) като процентил от (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (изберете user_id ,count(продажби ) като общо от `поръчка ` група по user_id )p, (SELECT @curRank :=0) rORDER BY total desc ) като dt,(изберете брой(отличен user_id) ) като cnt от`поръчка `) като ct
Ако вече имате общи продажби за всеки потребител в таблицата и искате директно да използвате таблицата за изчисляване на процентил, ето заявка
изберете user_id ,total,rank,round(100*(cnt-rank)/cnt,0) като процентил от (SELECT user_id,total,@curRank :=@curRank + 1 КАТО рангFROM `order` p, (SELECT @curRank :=0) rORDER BY total desc ) като dt,(изберете брой(отличен user_id) ) като cnt от`поръчка `) като ct
перцентили+-----------+---------+--------+------------ --+| потребителски_идентификатор | общо | ранг | процентил |+-----------+-----------+--------+-------------- -+| 1 | 3 | 1 | 66,67 || 4 | 2 | 2 | 33,33 || 3 | 1 | 3 | 0 |+----------+---------+--------+-------------- -+
SQL, за да създадете примерния ред на таблицата: