Понякога може да искате да изчислите процентил от актуалност в MySQL въз основа на. Например, за класиране на клиенти въз основа на скорошност на покупки или поръчки вместо общи продажби. Това помага за създаване на специални оферти за хора, които наскоро са купили нещо на вашия уебсайт. Все още няма функции за него. Ето готова заявка, за да го направите.
Напр. имате таблина поръчка който съдържа всички поръчки на продукти за всеки потребител. Искате да изчислите процентил от скорошността на поръчките.
<предварителна>поръчка+-----------+-----------+-----------------+| потребителски_идентификатор | продукт | дата_на_купуване |+-----------+------------+------------------+| 1 | Сапун | 2013-11-20 || 4 | Парфюм | 2013-07-02 || 1 | Юфка | 2013-10-20 || 4 | Сапун | 2013-11-11 || 1 | Лепило | 2013-09-12 || 3 | Део | 2013-10-20 |+-----------+-----------+------------------ +перцентили+-----------+----------------+--------+------- --------+| потребителски_идентификатор | най-новите | ранг | процентил |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33,33 |+-----------+----------------+--------+-------- -------+
Ето заявка, която можете да използвате за изчисляване на процентил от актуалност в MySQL. Просто заменете колоните – user_id, buy_date и table – order. Той получава най-новата дата на покупка за всеки потребител. След това ги класира по последна дата на покупка. Накрая изчислява процентил, използвайки ранг.
изберете user_id ,latest,rank,round(100*(cnt-rank+1)/cnt,0) като процентил от (SELECT user_id,latest,@curRank :=@curRank + 1 AS rankFROM (изберете user_id ,max(дата_на_покупка ) най-късно от `поръчка ` група по user_id )p, (ИЗБЕРЕТЕ @curRank :=0) rORDER BY най-ново описание ) като dt,(изберете брой(отличен user_id) ) като cnt от`поръчка `) като ct
Ако вече имате последна дата на покупка за всеки потребител в таблицата и искате директно да използвате таблицата за изчисляване на процентил от скорошността на покупката, ето заявка
изберете user_id ,purchase_date,rank,round(100*(cnt-rank+1)/cnt,0) като процентил от (SELECT user_id,purchase_date,@curRank :=@curRank + 1 AS rankFROM `order` p, (SELECT @curRank :=0) rORDER BY buy_date desc ) като dt,(изберете брой(отличен user_id ) като cnt от`поръчка `) като ct<предварителна>поръчка+-----------+----------------+--------+------- --------+| потребителски_идентификатор | дата_на_купуване| ранг | процентил |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 3 | 33,33 |+-----------+----------------+--------+-------- -------+
перцентили+-----------+----------------+--------+------- --------+| потребителски_идентификатор | дата_на_купуване| ранг | процентил |+-----------+----------------+--------+-------- -------+| 1 | 2013-11-20 | 1 | 100 || 4 | 2013-11-11 | 2 | 66,67 || 3 | 2013-10-20 | 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 | 2013-11-20 | 1 | 66,67 || 4 | 2013-11-11 | 2 | 33,33 || 3 | 2013-10-20 | 3 | 0 |+----------+----------------+--------+-------- -------+
SQL, за да създадете примерния ред на таблицата: