teradata,重置时间,分区依据,排序依据

时间:2018-11-16 19:55:04

标签: sql teradata

我需要帮助来了解以下代码。在Teradata中使用时,我从未见过重置。 RESET WHEN在Teradata中做什么?我会部分了解分区和顺序。我也不确定为什么没有按PARTITION BY A.ACCT_DIM_NB,A.DAY_TIME_DIM_NB ORDER BY A.TXN_POSTING_SEQ对分区进行分区。另外,行之间的行之间是否仅使用整个分区窗口?

Removed

2 个答案:

答案 0 :(得分:1)

  

我也不确定为什么未按PARTITION BY Y.ACCT_DIM_NB,Y.DAY_TIME_DIM_NB ORDER BY Y.DAY_TIME_DIM_NB,Y.TXN_POSTING_SEQ进行分区

不知道,但这会返回不同的结果(Y.DAY_TIME_DIM_NB中不需要ORDER BY,因为它已经被它分区了)

  

此外,行之间的行之间是否只使用整个分区窗口?

它与ROWS UNBOUNDED PRECEDING完全相同,即,累积最大值的语法变体。分区是ROWS UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

  

RESET在Teradata中执行什么操作?

RESET WHEN是Teradata扩展,用于动态添加分区,它是两个(在您的情况下)或三个嵌套的OLAP函数的较短语法:

-- using RESET WHEN
MAX(A.RUN_BAL_AM)
OVER (PARTITION BY A.ACCT_DIM_NB
      ORDER BY A.DAY_TIME_DIM_NB, A.TXN_POSTING_SEQ 
      RESET WHEN A.CS_TXN_CD NOT IN ('072','075','079','107','111','112','139','181','318') 
      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS  EOD_BAL_AM



-- Same result using Standard SQL
SELECT  
   Max(A.RUN_BAL_AM)
   Over (PARTITION BY A.ACCT_DIM_NB, dynamic_partition
         ORDER BY A.DAY_TIME_DIM_NB, A.TXN_POSTING_SEQ 
         ROWS BETWEEN Unbounded Preceding AND CURRENT ROW) AS  EOD_BAL_AM

FROM 
 ( 
   SELECT
      -- this cumulative sum over 0/1 assigns a new value for each series of rows based on the CASE
      Sum(CASE WHEN A.CS_TXN_CD NOT IN ('072','075','079','107','111','112','139','181','318') THEN 1 ELSE 0 end)
      Over (PARTITION BY A.ACCT_DIM_NB, dynamic_partition
            ORDER BY A.DAY_TIME_DIM_NB, A.TXN_POSTING_SEQ 
            ROWS Unbounded Preceding) AS dynamic_partition
   FROM ...
 ) AS dt

答案 1 :(得分:0)

  

RESET在Teradata中执行什么操作?

当子句为true时,重置窗口累积。网上有很多这样的例子,但是在您的情况下,我想像(从未见过将它与max一起使用),它有效地定义了一个点,自此开始计算最大值,并且每次遇到不在给定列表中的txid导致最大值只能从该点开始计算

  

我也不确定为什么没有按PARTITION BY Y.ACCT_DIM_NB,Y.DAY_TIME_DIM_NB ORDER BY Y.DAY_TIME_DIM_NB,Y.TXN_POSTING_SEQ进行分区。

您为什么认为应该?分区和顺序非常不同。如果您有银行系统,则在准备银行对帐单时,可以按帐户进行分区,但可以按日期对交易进行排序。

  

此外,行之间的行之间是否只使用整个分区窗口?

它定义了累加器应查看以获取其答案的记录段。在您的情况下,最大值仅针对前几行进行计算。无限制的在前含义(自分区开始以来的所有行)。当前行就是这个意思。其他有效的示例可能是:

ROWS BETWEEN 200 preceding and current row
ROWS BETWEEN 10 preceding and 20 following 
ROWS BETWEEN current row and unbounded following

因为您的窗口仅定义为前几行,所以随着行序的增加,最大值将停留在任何给定的最大值处,直到数据中出现新的最大值。例如:

Data,max
3,3
2,3
1,3
4,4
1,4
3,4
1,4
5,5
4,5
2,5
4,5
9,9
5,9

当您在当前行中找到比已知最大值更大的最大值时,便从上到下进行操作,它将成为新的最大值。仅在没有前几行限制的情况下,如果整个数据集都达到最大值,则每行报告的最大值为9