Mysql
 sql >> база данни >  >> RDS >> Mysql

Изчислете процентил в MySQL въз основа на общите суми

Може да е трудно да се изчисли процентил в 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, за да създадете примерния ред на таблицата:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи функцията FROM_BASE64() в MySQL

  2. Как да деактивирам кеширането на SQLAlchemy?

  3. Решаване на повреда на комуникационната връзка с JDBC и MySQL

  4. Колко голяма може да стане една MySQL база данни, преди производителността да започне да се влошава

  5. Как да деинсталирате MySQL от Mac OS X?