按组填写特定日期的值
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)
我在 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)