sql >> Base de Datos >  >> RDS >> Mysql

Calcular decil de actualidad en MySQL

A veces, es posible que desee calcular el decil a partir de la actualidad en MySQL en función de. Por ejemplo, para clasificar a los clientes según la antigüedad de las compras o los pedidos en lugar de según las ventas totales.

Calcular decil a partir de la actualidad

Esto ayuda a crear ofertas especiales para las personas que compraron algo recientemente en su sitio web. Todavía no hay funciones para él. Aquí hay una consulta preparada para hacerlo.

Por ejemplo, tiene una tabla pedidos que contiene todos los pedidos de productos para cada usuario. Desea calcular el decil a partir de la antigüedad de los pedidos.

order
+-----------+------------+------------------+
|  user_id  |   product  |   purchase_date  |
+-----------+------------+------------------+
|     1     |     Soap   |     2013-11-20   |
|     4     |   Perfume  |     2013-07-02   |
|     1     |   Noodles  |     2013-10-20   |
|     4     |     Soap   |     2013-11-11   |
|     1     |    Glue    |     2013-09-12   |
|     3     |     Deo    |     2013-10-20   |
+-----------+------------+------------------+
deciles
+-----------+----------------+---------+---------------+
|  user_id  |   latest       |  rank   |     decile    |
+-----------+----------------+---------+---------------+
|     1     |  2013-11-20    |    1    |      100      |
|     4     |  2013-11-11    |    2    |     66.67     |
|     3     |  2013-10-20    |    3    |     33.33     |
+-----------+----------------+---------+---------------+

Aquí hay una consulta que puede usar para calcular el decil a partir de la antigüedad en MySQL. Simplemente reemplace las columnas:ID de usuario, fecha de compra y tabla:orden. Obtiene la última fecha de compra de cada usuario. Luego los clasifica según la última fecha de compra. Finalmente, calcula el decil usando el rango.

select user_id,latest,rank,round(10*(cnt-rank+1)/cnt,0) as decile from   
(SELECT  user_id,latest,@curRank := @curRank + 1 AS rank
FROM      (select user_id,max(purchase_date) as latest from `order` group by user_id)
p, (SELECT @curRank := 0) r
ORDER BY  latest desc ) as dt,(select count(distinct user_id) as cnt from
`order`) as ct

Si ya tiene la última fecha de compra para cada usuario en la tabla y desea usar la tabla directamente para calcular el decil a partir de la antigüedad de la compra, aquí tiene una consulta