使用带有 case 语句和 max 函数的列创建一个新的 table

Create a new table with columns with case statements and max function

我在用 case 语句定义的新列从旧的创建新的 table 时遇到了一些问题。

我需要添加到新的 table 三列,我根据不同的条件计算最大值。具体来说,

  1. 如果时间在1到3之间,我定义一个变量max_var_1_3为max((-1)*var),
  2. 如果时间在1到6之间,我定义一个变量max_var_1_6为max((-1)*var),
  3. 如果时间在1到12之间,我定义一个变量max_var_1_12为max((-1)*var),

max函数需要分别在window1和3、1和6、1和12之间取变量var的最大值。

这是我写的

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 已经有一些列,我想导入所有这些列,然后将旧的 table 与新的进行比较。我收到一条错误消息,指出应该介于 ) 和 ',' 之间,但我不明白是什么。我正在使用 Teradata SQL。 请你帮助我好吗?

非常感谢

我无法帮助 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;

问题是您的查询中有 GROUP BY time,同时您试图 return 所有其他值与您的 SELECT t1.*。要使查询按原样工作,您需要将 t1.* 中的每一列添加到 GROUP BY 子句中。

如果您想要在不同的 time 范围内找到 MAX 值并且还要在所有行中找到 return 值,那么您可以使用 window 函数。像这样:

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)
;

逻辑如下:

  • 检查一行是否在
  • 范围内
  • 如果是,return 该范围内行的所需 MAX
  • 否则,仅 return 给定行的默认值 (var)
  • return 所有行以及三个新列

如果您遇到性能问题,您也可以将 max_var 计算移动到 CTE,因为它们只需要计算一次。另外,为了避免混淆,您可能希望在 SELECT 中明确指定值,而不是使用 t1.*.

我没有要测试的 TD 系统,但试试看是否有效。