【问题标题】:populate a column based on current row and previous row's value mysql根据当前行和上一行的值填充一列mysql
【发布时间】:2017-12-24 00:45:03
【问题描述】:

我有一张桌子tb1是这样的:

ID      DATE_     STATs 
1      2007-01     0.2
1      2007-02     0.12
1      2007-03     0.42
1      2007-04     0.23
1      2007-05     0.26
1      2007-06     0.17
2      2007-01     0.33
2      2007-02     0.14
2      2007-03     0.21
2      2007-04     0.35
2      2007-05     0.67
2      2007-06     0.07

如何添加一个额外的列计算:

(1+current.STATs) / (1+priorMonth.STATs) - 1

对于每个 ID?

【问题讨论】:

    标签: mysql updating


    【解决方案1】:

    初步:为了让事情变得更容易,制作date_ 和实际的date。用第一天来表示一个月是很常见的。这就是我所做的。

    选项 1:使用子查询

    SELECT
        id, date_, 
        (1.0 + stats) / (1.0 + (SELECT stats FROM t t_prev WHERE t_prev.id = t.id AND t_prev.date_ = t.date_ - interval 1 month)) - 1.0 AS r
    FROM
        t
    ORDER BY
        id, date_ ;
    

    选项 2:(左)一个月前加入同一张表

    SELECT
        curr.id, curr.date_, (1.0 + curr.stats) / (1 + prev.stats) - 1.0 AS r
    FROM
        t AS curr
        LEFT JOIN t AS prev 
            ON prev.id = curr.id AND prev.date_ = curr.date_ - interval 1 month 
    ORDER BY
       curr.id, curr.date_ ;
    

    在这两种情况下,您都会得到:

    编号 |日期_ | r -: | :--------- | ------------------: 1 | 2007-01-01 | 1 | 2007-02-01 | -0.06666667121979919 1 | 2007-03-01 | 0.26785713418538926 1 | 2007-04-01 | -0.13380280596423388 1 | 2007-05-01 | 0.024390232674120105 1 | 2007-06-01 | -0.07142856298120104 2 | 2007-01-01 | 2 | 2007-02-01 | -0.14285715085991468 2 | 2007-03-01 | 0.06140350246565207 2 | 2007-04-01 | 0.11570248045838927 2 | 2007-05-01 | 0.23703705486119708 2 | 2007-06-01 | -0.35928144335037204

    您可以在 dbfiddle here

    上查看所有内容

    【讨论】:

    • 谢谢。左连接方式对我来说更可取,好看又清晰!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多