Введите значения из других данных в том же столбце (Teradata) - PullRequest
0 голосов
/ 02 мая 2018

У меня есть таблица, которая является результатом запроса (это большой!), Который выглядит следующим образом.

Таблица пытается посчитать набор (seq_num 1,2 ..) имен в каждом идентификаторе по типу, но оставляет нули, когда в одном и том же идентификаторе появляется другой тип

Я бы хотел получить результат, который выглядит следующим образом.

This is the result that I would like to have.

Невозможно использовать подзапрос или max, потому что для этого потребуется группа, из-за которой возникнет боль, поскольку запрос уже слишком сложен.

Был бы очень признателен за помощь здесь. Спасибо!

Код запроса для этих 4 дополнительных столбцов справа:

CASE WHEN (TYPE = 'E') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_E,

CASE WHEN (TYPE = 'M') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_M,

CASE WHEN (TYPE = 'D') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_D,

CASE WHEN (TYPE = 'C') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_C

ПРИМЕЧАНИЕ. У меня есть другие идентификаторы, в которых ТИП не изменяется, и именно тогда он работает нормально, и я могу понять, почему это так. Проблема в том, что информация в каждом ID довольно разнообразна.

1 Ответ

0 голосов
/ 02 мая 2018

Требуется COUNT(DISTINCT Name) OVER (PARTITION BY ID, TYPE), который не поддерживается в Teradata.

Наиболее эффективным способом будет вложенная OLAP-функция, которая приведет к двум STAT-шагам, как ваше текущее решение, так что это не должно быть менее эффективным:

SELECT dt.*,
    Max(CASE WHEN type = 'E' THEN nc END) Over (PARTITION BY id) AS NC_E
   ,Max(CASE WHEN type = 'M' THEN nc END) Over (PARTITION BY id) AS NC_M 
   ,Max(CASE WHEN type = 'D' THEN nc END) Over (PARTITION BY id) AS NC_D 
   ,Max(CASE WHEN type = 'C' THEN nc END) Over (PARTITION BY id) AS NC_C 
FROM
 ( 
   SELECT ....
      Dense_Rank() Over (PARTITION BY ID, TYPE_ ORDER BY NAME) AS nc
   FROM ...
 ) AS dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...