【问题标题】:Calculate the percentage of change in price with reflected to previous observation, group by price type?计算价格变化的百分比,反映到先前的观察,按价格类型分组?
【发布时间】:2020-08-20 14:40:40
【问题描述】:

我正在尝试计算价格的每日百分比变化,并根据价格类型反映之前的观察结果。

当我运行这个查询时,它似乎在计算百分比变化,但计算是从一种价格类型到另一种价格类型完成的。

我想通过 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.com/s/fq57pks2d28i1j4/example.csv?dl=0

【问题讨论】:

    标签: mysql percentage price


    【解决方案1】:

    我想你想要这个(给你的表添加索引,否则会很慢):

    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 将表链接到自身。您将需要它,因为您想将同一张表中的当前(当前)值与上一个(上一个)值进行比较

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

    datepriceTypeID 添加索引。 并将主键添加到您的表中。 只是为了确定,因为如果你弄错了,一切都会搞砸:确保你的日期是 DATE 数据类型,而不是 (VAR)CHAR 数据类型。

    如果要进行选择,请添加WHERE,否则您将获得整个表格,包括所有日期。

    注意:尽可能远离 MySQL 中的 @variables。很难用它们获得可靠的结果。有时,您可能需要几个月的时间才能发现事情出错了。

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 2022-12-11
      • 2016-05-09
      相关资源
      最近更新 更多