Teradata 保留价值直到下一次更改

Posted

技术标签:

【中文标题】Teradata 保留价值直到下一次更改【英文标题】:Teradata Retain value till next Change 【发布时间】:2019-10-25 12:29:27 【问题描述】:

我需要将以前的值存储在列中,直到发生更改,如果发生更改,它将保留新值

例子

Input
-------
ID Name Stdt        EndDt
1  A    20/01/2019  20/02/2019
1  B    20/02/2019  20/03/2019
1  C    20/03/2019  15/05/2019
1  C    15/05/2019  16/05/2019
1  C    16/05/2019  19/06/2019
1  C    19/06/2019  15/07/2019
1  A    15/07/2019  NULL


Output
----------
ID Name Stdt        EndDt       Previous Name
1  A    20/01/2019  20/02/2019  NULL
1  B    20/02/2019  20/03/2019  A
1  C    20/03/2019  15/05/2019  B
1  C    15/05/2019  16/05/2019  B
1  C    16/05/2019  19/06/2019  B
1  C    19/06/2019  15/07/2019  B
1  A    15/07/2019  NULL        C

尝试了前置和自连接,但仅限于知道更改次数(例如名称可以保持不变 N 次)但需要更多动态

【问题讨论】:

【参考方案1】:

你需要嵌套的窗口函数:

SELECT ...
   -- assignt the previous value to all following rows
   Last_Value(CASE WHEN prev_name <> NAME THEN prev_name END IGNORE NULLS)
   Over (PARTITION BY id 
         ORDER BY stdt, enddt) as previous_name
FROM 
 ( 
   SELECT ...
      -- flag the changed row
      Lag(NAME) Over (PARTITION BY id ORDER BY stdt, enddt) AS prev_name

      -- pre-TD 16.10
      -- MIN(NAME) 
      -- Over (PARTITION BY id ORDER BY stdt, enddt
      --       ROWS BETWEEN 1 Preceding AND 1 Preceding) AS prev_name
   FROM mytable
 ) AS dt

【讨论】:

【参考方案2】:

非常感谢它的魅力所在。

P.S :对不起,我正在度假,要求发生了一些变化,所以没有检查提供的这个解决方案。

再次感谢您一直以来的知识祝福我们:)

问候 阿宁迪亚

【讨论】:

以上是关于Teradata 保留价值直到下一次更改的主要内容,如果未能解决你的问题,请参考以下文章

如果 Outlook 关闭,则从 C# OOM 发送的电子邮件将保留在发件箱中,直到下一次 Outlook 启动

派发后直到下一次渲染才反映最新状态

在python中获取下一次DST更改的时间

Teradata全面转型

如何在应用程序/数据库中保留未提交的数据直到它被提交

Teradata的案例时选择属性