Mysql 获取最后记录的百分比差异
我有下一张桌子:Mysql 获取最后记录的百分比差异,mysql,sql,Mysql,Sql,我有下一张桌子: +----+-----------+------------+-----------+ | ID | market_id | last_value | timestamp | +----+-----------+------------+-----------+ | 1 | 1 | 10 | 1001 | | 2 | 1 | 15 | 1002 | | 3 | 1 |
+----+-----------+------------+-----------+
| ID | market_id | last_value | timestamp |
+----+-----------+------------+-----------+
| 1 | 1 | 10 | 1001 |
| 2 | 1 | 15 | 1002 |
| 3 | 1 | 25 | 1003 |
| 4 | 1 | 30 | 1004 |
| 5 | 1 | 05 | 1005 |
+----+-----------+------------+-----------+
我的想法与此类似:
SELECT id, market_id, last_value, timestamp from data_markets
where from_unixtime(timestamp, '%d-%m-%Y %H:%m:%s') >= DATE_FORMAT(NOW(),'%d-%m-%Y 00:00:00') and market_id = 1
有了这个,我得到了今天的所有行,但我知道使用join可以得到:
+---+----------------------+--------------------+----------+
| market_id | change | total_change | is_down |
+-----------+--------------+--------------------+----------+
| 1 | 83.3% | -50.00% | true |
+-----------+--------------+--------------------+----------+
说明:
- 更改:此值与最后一行的差值
- 总更改:该值是“24小时”中所有行的差异
- 是向下的:它可能知道该值相对于总更改是增加还是减少
我编辑了这个示例,总的来说,我喜欢所有行的差异,但这不可能是第一行的差异。我认为这是一个查询,它提供了您想要的大部分内容
SELECT
dm.id,
dm.market_id,
dm.last_value,
(@prev_value := (SELECT last_value FROM data_markets WHERE (id < dm.id AND market_id = dm.market_id) ORDER BY id DESC LIMIT 1)) AS prev_value,
ROUND((@24hr_value := (SELECT AVG(last_value) FROM data_markets WHERE (timestamp >= (dm.timestamp - 86400) AND timestamp < dm.timestamp AND market_id = dm.market_id))),1) AS 24hr_value,
ROUND(IF(@prev_value,(((dm.last_value - @prev_value) / @prev_value) * 100),0),1) AS percent_change,
ROUND((@24hr_change := IF(@24hr_value,(((dm.last_value - @24hr_value) / @24hr_value) * 100),0)),1) AS 24hr_change,
IF(@24hr_change < 0, 'down', IF(@24hr_change > 0, 'up', '-')) AS direction
FROM
data_markets dm,
(SELECT
@prev_value:=0,
@24hr_value:=0,
@24hr_change:=0
) r
WHERE
dm.market_id = 1
ORDER BY
dm.id ASC
以及最终结果集:
===============================================================================
|id | market_id | last_value | prev | 24hr | change | 24hr_change | direction |
===============================================================================
| 1 | 1 | 10 | NULL | NULL | 0.0 | 0.0 | - |
| 2 | 1 | 15 | 10 | NULL | 50.0 | 0.0 | - |
| 3 | 1 | 25 | 15 | NULL | 66.7 | 0.0 | - |
| 4 | 1 | 30 | 25 | 25.0 | 20.0 | 20.0 | up |
| 5 | 1 | 5 | 30 | 27.5 | -83.3 | -83.6 | down |
===============================================================================
你所说的过去24小时的总变化是什么意思?如果在过去的24小时内同时有一个大得多的值和一个小得多的值呢?这将创建两个完全不同的总更改值。还是你指的是24小时平均值?@Jay:我想他想把一行和其他行进行比较,然后打印出变化百分比(%)的变化。如果最后一个值是10,倒数第二个值是20,那么变化是100%(我认为)。总变化是1整天的这个百分比。
===============================================================================
|id | market_id | last_value | prev | 24hr | change | 24hr_change | direction |
===============================================================================
| 1 | 1 | 10 | NULL | NULL | 0.0 | 0.0 | - |
| 2 | 1 | 15 | 10 | NULL | 50.0 | 0.0 | - |
| 3 | 1 | 25 | 15 | NULL | 66.7 | 0.0 | - |
| 4 | 1 | 30 | 25 | 25.0 | 20.0 | 20.0 | up |
| 5 | 1 | 5 | 30 | 27.5 | -83.3 | -83.6 | down |
===============================================================================