计算反映到前次观察的价格变化百分比,按价格类型分组?

问题描述 投票:0回答:1

我想按价格类型计算反映到前次观察结果的每日价格变化百分比。

当我运行这个查询时,似乎计算出了百分比变化,但计算是从一个价格类型到另一个价格类型。

我想通过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

mysql percentage price
1个回答
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

结果(第一行):

result

它的作用是什么?

LEFT JOIN把表和自己连接起来。你需要这样做,因为你要比较同一张表的当前(curr)值和之前(prev)值。

第三次出现的t为findPrev的子查询需要找到当前日期之前的最后一个日期(curr.date),这将是比当前日期低的最大日期。

将索引添加到 datepriceTypeID. 然后添加一个主键到你的表中,为了确保,因为如果你弄错了,会把一切都搞乱:确保你的日期是在DATE数据类型中,而不是在(VAR)CHAR数据类型中。

添加一个 WHERE 如果你想做一个选择,否则你将得到整个表格,包括所有的日期。

注意事项: 尽可能远离MySQL中的@variables。使用这些变量很难得到可靠的结果。有时,你要花上几个月的时间才会注意到事情出了问题。

© www.soinside.com 2019 - 2024. All rights reserved.