我有一个表格,其中包含每月金额和上个月的金额。
每个月我都需要携带上个月的金额(如果不存在)。
为了更好地解释(并举例),我可能有以下数据;
Month,Amount,Previous
2019-01-01,100,0
2019-02-01,100,100
2019-03-01,100,null
2019-04-01,100,null
2019-05-01,100,200
2019-06-01,100,null
所以我想将 100 带到三月和四月,然后将 200 带到六月,所以它看起来像这样;
Month,Amount,Previous
2019-01-01,100,0
2019-02-01,100,100
2019-03-01,100,100
2019-04-01,100,100
2019-05-01,100,200
2019-06-01,100,200
我只是空白,我知道有一种方法,但头脑根本无法将其组合在一起。
我认为这将涉及同一个表上的 LEFT JOIN 并获取 MIN 月份值,其中日期的金额大于上个月值但不大于下个月值。
或者它将在 WHERE 子句和 LEFT JOIN 中执行子查询。
到目前为止,我已经管理了以下内容,但它为每个先前值(100 和 200)重复了 5 月和 6 月行。
SELECT
*
FROM
table1 t1
LEFT JOIN
table1 t2 ON
t1.month > t2.month
Month,Amount,Previous
2019-01-01,100,0
2019-02-01,100,100
2019-03-01,100,100
2019-04-01,100,100
2019-05-01,100,200
2019-05-01,100,100
2019-06-01,100,200
2019-06-01,100,100
最佳答案
drop table if exists t;
create table t
(Month date,Amount int,Previous int);
insert into t values
('2019-01-01',100,0),
('2019-02-01',100,100),
('2019-03-01',100,null),
('2019-04-01',100,null),
('2019-05-01',100,200),
('2019-06-01',100,null);
select t.*,
case when previous is null then
(select previous from t t1 where t1.month < t.month and t1.previous is not null order by month desc limit 1)
else previous
end as previousdownfilled
from t;
+------------+--------+----------+--------------------+
| Month | Amount | Previous | previousdownfilled |
+------------+--------+----------+--------------------+
| 2019-01-01 | 100 | 0 | 0 |
| 2019-02-01 | 100 | 100 | 100 |
| 2019-03-01 | 100 | NULL | 100 |
| 2019-04-01 | 100 | NULL | 100 |
| 2019-05-01 | 100 | 200 | 200 |
| 2019-06-01 | 100 | NULL | 200 |
+------------+--------+----------+--------------------+
6 rows in set (0.00 sec)
其中 case 语句检查是否需要完成某些操作,并且相关的 cub 查询会执行此操作。但我怀疑这项工作应该在创建此表的代码中完成。
关于sql - 使用从最后一个值到下一个填充值的值更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56788469/