teradata, сбросить, когда, разделить, упорядочить по - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужна помощь в понимании приведенного ниже кода.Я никогда не видел сброс при использовании в Teradata.Что RESET КОГДА делает в Teradata?Я понимаю раздел и порядок по частям.Я также был не уверен, почему это не было разделено на PARTITION BY A.ACCT_DIM_NB, A.DAY_TIME_DIM_NB ORDER BY A.TXN_POSTING_SEQ.Кроме того, являются ли строки между незакрепленным PRECEDING и текущей строкой только при использовании всего разделенного окна?

Removed

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Что RESET КОГДА делает в Teradata?

Сбрасывает накопление окна, когда условие истинно.Множество примеров этого в действии в сети, но в вашем случае, я думаю, (никогда не видел, чтобы он использовался с max), он эффективно определяет точку, с которой вычисляется max, и каждый раз, когда встречается txid, отсутствующий в данном списке.это заставляет макс рассчитываться только из этой точки

Я также был не уверен, почему это не было разделено на PARTITION BY Y.ACCT_DIM_NB, Y.DAY_TIME_DIM_NB BY Y.DAY_TIME_DIM_NB, Y.TXN_POSTING_SEQ.

Почему вы думаете, что это должно?Раздел и порядок очень разные.Если у вас была банковская система, вы могли бы разбивать счета по счетам, но заказывать транзакции по дате, если вы готовите выписку по счету.

Кроме того, строки между несвязанными PRECEDING и CURRENT ROW просто используют целое разделенное на частиwindow?

Определяет сегмент записей, в которые должен обратиться аккумулятор, чтобы получить свой ответ.В вашем случае макс рассчитывается только по предыдущим строкам.Неограниченное предшествующее средство (все строки с начала раздела).Текущий ряд означает именно это.Другими допустимыми примерами могут быть:

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 для каждой строки

0 голосов
/ 16 ноября 2018

Я также не был уверен, почему это не было разделено на PARTITION 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, потому что он уже разделен им)

Кроме того, строки между неограниченным PRECEDING и CURRENT ROW просто используют все разделенное окно?

Это точно так же, как ROWS UNBOUNDED PRECEDING, то есть изменение синтаксиса для совокупного максимума.Lpartition ROWS UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

Что RESET WHEN делает в 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
...