我在填写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
有什么建议吗?谢谢!
答案 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试验台,所以你必须告诉我们它是否有效。或者你遇到什么错误