我想按价格类型计算反映到前次观察结果的每日价格变化百分比。
当我运行这个查询时,似乎计算出了百分比变化,但计算是从一个价格类型到另一个价格类型。
我想通过pricetypeID来计算价格变化的百分比。
你有什么想法如何实现它?任何提示将是非常感激
select priceTypeID, date, price,
if(@last_entry = 0, 0, round(((price - @last_entry) / @last_entry) * 100,2)) "percentageChange",
@last_entry := price
from
(select @last_entry := 0) x,
(select date, `t`.price, `t`.priceTypeID
from `t`
order by `t`.priceTypeID, `t`.date asc) y;
order by date ASC
示例数据在这里。https:/www.dropbox.comsfq57pks2d28i1j4example.csv?dl=0
我想你要的是这个(在你的表中添加索引,否则会很慢)。
SELECT curr.*,
prev.date AS `last date`, prev.price AS `last price`,
CONCAT(ROUND((curr.price/prev.price-1)*100,2),'%') AS `change`
FROM t curr
LEFT JOIN t prev
ON curr.priceTypeID=prev.priceTypeID
AND prev.date = (SELECT MAX(date)
FROM t findPrev
WHERE findPrev.priceTypeID=curr.priceTypeID
AND findPrev.date < curr.date)
ORDER BY date DESC, priceTypeID
结果(第一行):
它的作用是什么?
LEFT JOIN把表和自己连接起来。你需要这样做,因为你要比较同一张表的当前(curr)值和之前(prev)值。
第三次出现的t为findPrev的子查询需要找到当前日期之前的最后一个日期(curr.date),这将是比当前日期低的最大日期。
将索引添加到 date
和 priceTypeID
. 然后添加一个主键到你的表中,为了确保,因为如果你弄错了,会把一切都搞乱:确保你的日期是在DATE数据类型中,而不是在(VAR)CHAR数据类型中。
添加一个 WHERE
如果你想做一个选择,否则你将得到整个表格,包括所有的日期。
注意事项: 尽可能远离MySQL中的@variables。使用这些变量很难得到可靠的结果。有时,你要花上几个月的时间才会注意到事情出了问题。