Може да е трудно да се изчисли процентил в MySQL. Все още няма функции за него. Процентилите са полезни за класиране и групиране на потребители или клиенти.
Можете да идентифицирате най-ценните си потребители или клиенти и да създавате специални оферти за тях. Ето готова заявка, за да го направите.
Напр. имате таблина поръчка който съдържа всички поръчки на продукти за всеки потребител. Искате да изчислите процентил.
<предварителна>поръчка+-----------+-----------+----------+| потребителски_идентификатор | продукт | продажби |+-----------+------------+----------+| 1 | Сапун | 10 || 4 | Парфюм | 100 || 1 | Юфка | 20 || 3 | Део | 200 |+-----------+------------+----------+перцентили+-----------+---------+--------+------------ --+| потребителски_идентификатор | общо | ранг | процентил |+-----------+-----------+--------+-------------- -+| 1 | 30 | 3 | 33,33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+-----------+---------+--------+-------------- -+
Ето заявка, която можете да използвате за изчисляване на процентил в 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 ,sum(продажби ) като общо от `поръчка ` група по 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 | 30 || 4 | 100 || 3 | 200 |+-----------+----------+
перцентили+-----------+---------+--------+------------ --+| потребителски_идентификатор | общо | ранг | процентил |+-----------+-----------+--------+-------------- -+| 1 | 30 | 3 | 33,33 || 4 | 100 | 2 | 66,67 || 3 | 200 | 1 | 100 |+-----------+---------+--------+-------------- -+
Както можете да видите, последният класиран потребител няма нулев процентил. Това е естеството на изчислението на процентил. Или първият човек може да има 100 процентил, или последният класиран може да има нула. И двете не могат да се случат едновременно. Ако искате да принудите последния класиран човек да има нулев процентил, можете да използвате следните заявки. Не добавям 1 към ранга, докато изчислявам процентил.
изберете user_id ,total,rank,round(100*(cnt-rank)/cnt,0) като процентил от (SELECT user_id,total,@curRank :=@curRank + 1 AS rankFROM (изберете user_id ,sum(продажби ) като общо от `поръчка ` група по 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 | 30 | 3 | 0 || 4 | 100 | 2 | 33,33 || 3 | 200 | 1 | 66,67 |+-----------+---------+--------+-------------- -+
SQL, за да създадете примерния ред на таблицата: