首页 > 解决方案 > 通过 LEAD/LAG 或递归 CTE 更新?

问题描述

有一个表格持有日期和账户余额。但是,余额在某些日期不可用。假设当日期不可用时余额不会改变。如何更新所有日期的余额信息?

这是一个示例:表 D 包含所有有效日期。

2000-01-01
2000-01-02
2000-01-03
2000-01-04
2000-01-05
2000-01-06
2000-01-07
2000-01-08
2000-01-09

表 A 包含日期和帐户余额。

2000-01-02  $100
2000-01-05  $200
2000-01-09  $700

最终,我想生成一个这样的表:

2000-01-01  null
2000-01-02  $100
2000-01-03  $100
2000-01-04  $100
2000-01-05  $200
2000-01-06  $200
2000-01-07  $200
2000-01-08  $200
2000-01-09  $700

我想过以下几点:

但是,似乎它们都不适合这种情况。

标签: mysqlsqlsql-server

解决方案


ANSI SQL。

Table_D
-------
dd(field name)
-------
2000-01-01
2000-01-02
2000-01-03
2000-01-04
2000-01-05
2000-01-06
2000-01-07
2000-01-08
2000-01-09


Table_A
-------
dd(field name) cost(field name)
-------
2000-01-02  $100
2000-01-05  $200
2000-01-09  $700


select a.dd
  , (
    case when a.cost is null then min(a.cost) OVER (partition by a.cost_group ORDER BY a.dd) else a.cost end
  ) as cost
from (
    select a.dd, b.cost
      , count(b.cost) over (order by a.dd) as cost_group
    from Table_D a
    left join Table_A b on (b.dd = a.dd)
) a  

推荐阅读