【问题标题】:Teradata NORMALIZE optionsTeradata NORMALIZE 选项
【发布时间】:2020-12-22 19:35:18
【问题描述】:

我一直在使用 td_normalize_overlap_meet 来折叠时段。我在论坛上看到了一些使用 CNT 来识别被折叠的周期数的示例,并且我一直在搜索文档以查看是否存在其他类似功能但没有找到任何东西。我正在专门寻找一个可以保留最后一个折叠期间的开始日期的。例如,假设我有这些时期:

+-----------+------------+
|Start Date | End Date   |
+-----------+------------+
|2018-01-02 | 2018-01-04 |
|2018-01-05 | 2018-01-07 |
|2018-01-08 | 2018-01-10 |
+-----------+------------+

然后我将它们折叠成这样:

+-----------+------------+-----+
|Start Date | End Date   | CNT |
+-----------+------------+-----+
|2018-01-02 | 2018-01-10 | 3   |
+-----------+------------+-----+

有没有类似于 CNT 的函数可以给我这个?

+-----------+------------+-----+------------------------------------+
|Start Date | End Date   | CNT | Last Collapsed Period's Start Date |
+-----------+------------+-----+------------------------------------+
|2018-01-02 | 2018-01-10 | 3   | 2018-01-08                         |
+-----------+------------+-----+------------------------------------+

【问题讨论】:

  • 它没有功能,但是td_normalize_overlap_meet可以通过多种方式重写(实际上你在使用SELECT NORMALZE时根本不需要它。你的Teradata版本是什么,它支持@ 987654326@?
  • 前几天我第一次看到SELECT NORMALIZE子句,我需要开始使用它。我正在发布 16.20.48.01。不久前,我用nPath 玩了几天,当我在你的回复中遇到td_normalize_overlap_meet 时放弃了。我可以通过在正常化后回到崩溃前的时期来获得我需要的东西;我只是好奇是否有办法在 normalize 中做到这一点以提高效率。

标签: teradata normalize


【解决方案1】:

SELECT NORMALIZE 是非常简单的语法(尤其是与那些td_normalize...函数相比),但不能用于获取行数最后一行的开始日期。

获得所需结果的最简单方法是使用nPath 表运算符。假设要规范化的行不止一组:

WITH cte AS 
 ( -- the base Select creating the not yet normalized rows
   SELECT *
   FROM mytab
 )
SELECT * 
FROM 
   NPath(ON cte
         PARTITION BY col -- grouping column(s)
         ORDER BY Start_date
         USING
           MODE (NonOverlapping)
           Symbols (start_date-1 > lag(end_date, 1, date '0001-01-01') AS newgrp, -- starting row of a group of overlapping rows
                    start_date-1 <= lag(end_date, 1, ) as x)                      -- overlapping row
           Pattern ('newgrp.x*')                                                  -- start plus overlapping rows
           RESULT(First (col OF newgrp) AS col,                                   -- grouping column(s)
                  first (start_date OF ANY(newgrp, x)) AS start_date,             -- start date of group 
                  last  (end_date   OF ANY(newgrp, x)) AS end_date,               -- end date of group
                  Count (*          OF ANY(newgrp, x)) AS Cnt,                    -- number of rows in group
                  last  (start_date OF ANY(newgrp, x)) AS last_start              -- start date of last row in group
                 )
        );

【讨论】:

  • 谢谢!看起来是一种优雅的方式,我一定会再次使用 nPath 来更好地理解它。
  • nPath 很棒,它用于模式匹配(类似于 Oracle 的 MATCH_RECOGNIZE),但也可以用于其他任务,例如stackoverflow.com/a/63685218/2527905 替换 LIST_AGG
  • 是的,symbols 子句让我想起了我使用但也不完全理解的 MATCH_RECOGNIZE。我一直在用 XMLAGG 代替 LISTAGG,nPath 效率更高吗?哎呀,刚刚看了你链接的帖子,看到了你的最后一句话!
  • @dnoeth- Npath 不仅仅是 Vantage 的东西?
  • @Andrew:(Aster)函数的完整堆栈仅在机器学习/图形引擎中,但自 15.10 起,其中一些 Aster 函数已被移植到 SQL 引擎,请参阅docs.teradata.com/reader/CWVY0AJy8wyyf7Sm0EsK~w/…
猜你喜欢
  • 2014-07-28
  • 2020-06-14
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2018-05-11
  • 2011-03-06
相关资源
最近更新 更多