Создать новую таблицу со столбцами с инструкциями case и функцией max - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть некоторые проблемы при создании новой таблицы из старой с новыми столбцами, определенными инструкциями case.

Мне нужно добавить в новую таблицу три столбца, где я вычисляю максимум исходя из разных условий.В частности,

  1. , если время находится между 1 и 3, я определяю переменную max_var_1_3 как max ((- 1) * var),
  2. , если время между 1 и 6, Iопределить переменную max_var_1_6 как max ((- 1) * var),
  3. , если время между 1 и 12, я определяю переменную max_var_1_12 как max ((- 1) * var),

Функция max должна принимать максимальное значение переменной var в окне между 1 и 3, 1 и 6, 1 и 12 соответственно.

Я написал это

create table new as(
select t1.*,
  (case when time between 1 and 3 then MAX((-1)*var) 
 else var
end) as max_var_1_3,
  (case when time between 1 and 6 then MAX((-1)*var) 
 else var
end) as max_var_1_6,
  (case when time between 1 and 12 then MAX((-1)*var) 
 else var
end) as max_var_1_12
from old_table t1
group by time
) with data primary index time

но, к сожалению, это не работает.В old_table уже есть несколько столбцов, и я хотел бы импортировать их все, а затем сравнить старую таблицу с новой.Я получил ошибку, которая говорит, что должно быть что-то между) и ',', но я не могу понять, что.Я использую Teradata SQL.Не могли бы вы мне помочь?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Проблема в том, что у вас есть GROUP BY time в вашем запросе, когда вы пытаетесь вернуть все остальные значения с помощью SELECT t1.*.Чтобы ваш запрос работал как есть, вам нужно добавить каждый столбец из t1.* в ваше предложение GROUP BY.

Если вы хотите найти значение MAX в другом timeдиапазоны AND также возвращают все строки, тогда вы можете использовать оконную функцию.Примерно так:

CREATE TABLE new AS (
  SELECT 
    t1.*,
    CASE 
      WHEN t1.time BETWEEN 1 AND 3 THEN (
        MAX(CASE WHEN t1.time BETWEEN 1 AND 3 THEN (-1 * t1.var) ELSE NULL END) OVER()
      ) 
      ELSE t1.var 
    END AS max_var_1_3,
    CASE 
      WHEN t1.time BETWEEN 1 AND 6 THEN (
        MAX(CASE WHEN t1.time BETWEEN 1 AND 6 THEN (-1 * t1.var) ELSE NULL END) OVER()
      ) 
      ELSE t1.var 
    END AS max_var_1_6,
    CASE 
      WHEN t1.time BETWEEN 1 AND 12 THEN (
        MAX(CASE WHEN t1.time BETWEEN 1 AND 12 THEN (-1 * t1.var) ELSE NULL END) OVER()
      ) 
      ELSE t1.var 
    END AS max_var_1_12,
  FROM old_table t1
) WITH DATA PRIMARY INDEX (time)
;

Вот логика:

  • проверить, попадает ли строка в диапазон
  • , если это так, вернуть желаемый MAXзначение для строк в этом диапазоне
  • , в противном случае просто верните значение по умолчанию для данной строки (var)
  • , верните все строки вместе с тремя новыми столбцами

Если у вас есть проблемы с производительностью, вы также можете переместить вычисления max_var в CTE, поскольку их нужно вычислять только один раз.Также, чтобы избежать путаницы, вы можете явно указать значения в SELECT вместо использования t1.*.

У меня нет системы TD для тестирования, но попробуйте и посмотрите, если этоработы.

0 голосов
/ 20 сентября 2019

Я не могу помочь с CREATE TABLE AS, но вам нужен следующий запрос:

SELECT
    t.*,
    (SELECT MAX(-1 * var) FROM old_table WHERE time BETWEEN 1 AND 3) AS max_var_1_3,
    (SELECT MAX(-1 * var) FROM old_table WHERE time BETWEEN 1 AND 6) AS max_var_1_6,
    (SELECT MAX(-1 * var) FROM old_table WHERE time BETWEEN 1 AND 12) AS max_var_1_12
FROM old_table t;
...