按组将值填写到特定日期

时间:2017-04-19 17:57:35

标签: sql teradata

我在填写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

对于每个组,我想将值列填充到Date等于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

有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

通常我会使用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试验台,所以你必须告诉我们它是否有效。或者你遇到什么错误