使用带有 case 语句和 max 函数的列创建一个新的 table
Create a new table with columns with case statements and max function
我在用 case 语句定义的新列从旧的创建新的 table 时遇到了一些问题。
我需要添加到新的 table 三列,我根据不同的条件计算最大值。具体来说,
- 如果时间在1到3之间,我定义一个变量max_var_1_3为max((-1)*var),
- 如果时间在1到6之间,我定义一个变量max_var_1_6为max((-1)*var),
- 如果时间在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 系统,但试试看是否有效。
我在用 case 语句定义的新列从旧的创建新的 table 时遇到了一些问题。
我需要添加到新的 table 三列,我根据不同的条件计算最大值。具体来说,
- 如果时间在1到3之间,我定义一个变量max_var_1_3为max((-1)*var),
- 如果时间在1到6之间,我定义一个变量max_var_1_6为max((-1)*var),
- 如果时间在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 系统,但试试看是否有效。