初步:为了让事情变得更容易,制作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
上查看所有内容