【问题标题】:Fill down value to specific date by group按组填写特定日期的值
【发布时间】:2017-09-16 02:35:41
【问题描述】:

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

有什么建议吗?谢谢!

【问题讨论】:

  • Case when Date<=EndDate then value else 0 end as value
  • 嗨 xQbert。当结果集按 ID 和日期排序时,我特别需要填写最后一个非零值。这是否考虑了该排序?
  • 哦 1 秒。我现在看到我们将先前的值向前推进,但前提是日期

标签: sql teradata


【解决方案1】:

您需要像这样应用基于 LAST_VALUE 的逻辑:当日期

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

【讨论】:

  • 尚未完全测试,但目前看起来一切都很好!
  • NullIfZero? :-)
  • @DuduMarkovitz:不,因为它是专有语法并且NullIf(Value,0)NullIfZero(Value) 短:-)
  • 大部分功能都是专有的... :-)
  • 附言。早上好:-)
【解决方案2】:

通常我会使用 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 的测试平台,因此您必须让我们知道它是否有效。或者你遇到什么错误

【讨论】:

  • 现在检查这个。谢谢!
  • 第二个可能会因为 coalese 而得到一些误报,但我不确定当前面的值不存在时你想如何处理这种情况......
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2023-01-25
  • 2020-11-10
  • 2023-03-05
  • 2019-12-05
相关资源
最近更新 更多