问题描述
我的数据库包含有关出租车服务的信息。我需要在 sql 代码中创建一个语句(我正在使用 MysqL),以确定上个月注册服务数量的百分比变化。
我有日期类型的列:“tpep_pickup_datetime”,格式如下 2020-01-01 00:33:03。
由于第一个月没有和谁比较,结果必须是“variacion_mes_anterior”列中的NULL,我不知道该怎么做。
我正在使用但对我不起作用的代码句是:
SELECT DATE_FORMAT(tpep_pickup_datetime,'%Y-%m') as mes,COUNT(id) as servicios,CONCAT(
( SELECT TruncATE((count(test.id)/count(t.id) -1) *100,0)
FROM test AS t
GROUP BY DATE_FORMAT(t.tpep_pickup_datetime,'%Y-%m')
LIMIT 1
),"%") as variacion_mes_anterior
FROM test
GROUP BY DATE_FORMAT(tpep_pickup_datetime,'%Y-%m')
ORDER BY DATE_FORMAT(tpep_pickup_datetime,'%Y-%m');
示例:
id | tpep_pickup_datetime |
---|---|
0 | 2020-01-01 00:33:03 |
1 | 2020-01-02 00:33:03 |
2 | 2020-01-03 00:33:03 |
3 | 2020-02-01 00:33:03 |
4 | 2020-02-02 00:33:03 |
5 | 2020-02-03 00:33:03 |
6 | 2020-02-04 00:33:03 |
这是针对我的问题的有效 sql 语句所期望的
me | 服务 | variacion_mes_anterior |
---|---|---|
2020-01 | 3 | NULL |
2020-02 | 4 | 33% |
解决方法
SELECT mes,servicios,CONCAT(ROUND(100 * (servicios / LAG(servicios) OVER (ORDER BY mes) - 1)),'%') variacion_mes_anterior
FROM ( SELECT DATE_FORMAT(tpep_pickup_datetime,'%Y-%m') mes,COUNT(*) servicios
FROM test
GROUP BY mes ) subquery
ORDER BY mes;