Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建一个新表,其中包含包含case语句和max函数的列_Sql_Teradata - Fatal编程技术网

Sql 创建一个新表,其中包含包含case语句和max函数的列

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

我在从一个旧表创建一个新表时遇到了一些问题,该表包含由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之间

这是我写的

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,这似乎做了同样的事情。而且更干净。谢谢你的回答。我试过你的建议,现在它起作用了。