Sql 创建一个新表,其中包含包含case语句和max函数的列
我在从一个旧表创建一个新表时遇到了一些问题,该表包含由case语句定义的新列 我需要向一个新表中添加三列,其中我根据不同的条件计算最大值。具体来说, 如果时间介于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函数需要取窗口中变量var的最大值,分别在1和3、1和6、1和12之间 这是我写的Sql 创建一个新表,其中包含包含case语句和max函数的列,sql,teradata,Sql,Teradata,我在从一个旧表创建一个新表时遇到了一些问题,该表包含由case语句定义的新列 我需要向一个新表中添加三列,其中我根据不同的条件计算最大值。具体来说, 如果时间介于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函数需要取窗口中变量var的最大值,分别在1和3、1和6、1和12之间 这是我写的 creat
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
但不幸的是,它不起作用。旧的_表已经有一些列,我想导入它们,然后将旧表与新表进行比较。我得到一个错误,说应该是介于和之间的,但我不明白是什么。我正在使用Teradata SQL。
你能帮帮我吗
非常感谢我无法帮助您创建表,但您需要的查询如下:
选择
t、 *,
从旧_表中选择MAX-1*var,其中时间介于1和3之间为MAX_var_1_3,
从旧_表中选择MAX-1*var,其中时间介于1和6之间为MAX_var_1_6,
从旧_表中选择MAX-1*var,其中时间介于1和12之间为MAX_var_1_12
从旧表t;
问题是,您在查询中使用GROUP BY time,同时尝试使用SELECT t1.*返回所有其他值。要使查询按原样工作,需要将t1.*中的每一列添加到GROUPBY子句中 如果希望在不同的时间范围内找到最大值,并返回所有行,则可以使用窗口函数。大概是这样的: 将表新建为 选择 t1.*, 案例 当t1.time介于1和3之间时 当t1.time介于1和3之间时为MAXCASE,然后-1*t1.var ELSE NULL结束 ELSE t1.var 结束为最大值变量1\u 3, 案例 当t1.time介于1和6之间时 当t1.time介于1和6之间时为MAXCASE,然后-1*t1.var ELSE NULL结束 ELSE t1.var 以max_var_1_6结尾, 案例 当t1.time介于1和12之间时 当t1.time介于1和12之间时为MAXCASE,然后-1*t1.var ELSE NULL结束 ELSE t1.var 以max_var_1_12结尾, 来自旧表t1 使用数据主索引时间 ; 逻辑是这样的: 检查一行是否在范围内 如果是,则为该范围内的行返回所需的最大值 否则,只需返回给定行的默认值var 返回所有行以及三个新列 如果您有性能问题,您还可以将max_var计算移动到CTE,因为它们只需要计算一次。此外,为了避免混淆,您可能希望在SELECT中显式指定值,而不是使用t1.*
我没有TD系统要测试,但请尝试一下,看看是否有效。欢迎使用Stack Overflow。什么是不工作?请阅读。示例数据、所需结果和适当的数据库标记都会有所帮助。我得到一个错误,它表示应该介于和之间。不幸的是,我无法共享任何示例数据。我要求了解我是否做了一些不正确的事情。我尽力解释清楚。因此,我想使用case-when语句和max-aggregation函数构建一个表,以计算新表中的新列。谢谢你的帮助确切的错误信息是什么?请复制粘贴。那些有问题的人是谁?除了另一个之外,我无法直接找到任何..语法错误:应为介于和','之间的内容。按时间和时间分组后。但是,代码中没有逗号。但我认为问题在于,当和maxcase的情况下,情况可能会简化为合并maxcase,当t1.time在1和3之间,然后-t1.var结束,t1.varYep,这似乎做了同样的事情。而且更干净。谢谢你的回答。我试过你的建议,现在它起作用了。