按组填写特定日期的值

Fill down value to specific date by group

我在 SQL 中填写一些值时遇到了一些麻烦。这是我的数据结构方式的示例。

ID  Date    Value  EndDate
A   1/1/17  500    6/1/17
A   2/1/17  489    6/1/17
A   3/1/17  480    6/1/17
A   4/1/17  475    6/1/17
A   5/1/17  460    6/1/17
A   6/1/17  0      6/1/17
A   7/1/17  0      6/1/17
B   4/1/17  784    8/1/17
B   5/1/17  801    8/1/17
B   6/1/17  0      8/1/17
B   7/1/17  0      8/1/17
B   8/1/17  0      8/1/17
B   9/1/17  0      8/1/17
B   10/1/17 0      8/1/17
C   2/1/17  980    7/1/17
C   3/1/17  564    7/1/17
C   4/1/17  647    7/1/17
C   5/1/17  500    7/1/17
C   6/1/17  0      7/1/17
C   7/1/17  0      7/1/17
C   8/1/17  0      7/1/17

对于每个组,我想将值列向下填充到日期等于 EndDate 的点。所需的输出如下所示

ID  Date    Value  EndDate
A   1/1/17  500    6/1/17
A   2/1/17  489    6/1/17
A   3/1/17  480    6/1/17
A   4/1/17  475    6/1/17
A   5/1/17  460    6/1/17
A   6/1/17  460    6/1/17
A   7/1/17  0      6/1/17
B   4/1/17  784    8/1/17
B   5/1/17  801    8/1/17
B   6/1/17  801    8/1/17
B   7/1/17  801    8/1/17
B   8/1/17  801    8/1/17
B   9/1/17  0      8/1/17
B   10/1/17 0      8/1/17
C   2/1/17  980    7/1/17
C   3/1/17  564    7/1/17
C   4/1/17  647    7/1/17
C   5/1/17  500    7/1/17
C   6/1/17  500    7/1/17
C   7/1/17  500    7/1/17
C   8/1/17  0      7/1/17

有什么建议吗?谢谢!

通常我会使用 Lag() 分析,但我认为 teradata 不支持它所以..

SELECT Id
     , Date
     , Case when Date<=EndDate then Lag(Value) over (order by ID, EndDate)
            else 0 end as value
     , EndDate
FROM Table

...所以也许...基于Teradata equivalent for lead and lag function of oracle

SELECT Id
     , Date
     , Case when Date<=EndDate then coalesce(MAX(Value) 
            over (Partition by 1 order by ID, EndDate ROWS BETWEEN 1 PRECEDING and 1 PRECEDING),0)
            else 0 end as value
     , EndDate
FROM Table

我没有用于 teradata 的测试平台,因此如果它有效,您必须告诉我们。或者你遇到了什么错误

您需要像这样应用基于 LAST_VALUE 的逻辑:当日期 <= EndDate 时将零更改为 NULL,然后查找最新的现有值

Last_Value(CASE
             WHEN Date <= EndDate
             THEN NullIf(Value,0)
             ELSE Value
           END IGNORE NULLS)
Over (PARTITION BY ID
      ORDER BY Date)