我有一个数据库,我使用一个查询来生成一个中间表,如下所示:
id a b
xx 1 2
yy 7 11 我想为a< avg(a)的用户计算b的标准差
我这样计算avg(a),它工作得很好:
select avg(select a from (query to produce intermediate table)) from table;但是查询:
select stddev_pop(b)
from (query to produce intermediate table)
where a < (select avg(select a
from (query to produce intermediate table))
from table);返回一个错误,更准确地说,我被告知avg中的"a“(select a from...)不被识别。这真的让我很困惑,因为它在前面的查询中是有效的。
如果有人能帮上忙,我将不胜感激。
编辑:
我将查询的结果存储到一个临时表中以生成中间表,但仍然遇到了相同的问题。非工作查询变为:
select stddev_pop(b) from temp where a < (select avg(a) from temp);在此过程中:
select avg(a) from temp;发布于 2012-11-30 18:27:15
好的,一个同事帮我做的。我会把答案贴出来,以防有人遇到同样的问题:
select stddev_pop(b)
from temp x
join (select avg(a) as average from temp) y
where x.a < y.average;基本上,hive不会将表作为变量进行缓存。
发布于 2012-11-30 01:43:26
您可能需要移动WHERE子句中的圆括号。试试这个:
select stddev_pop(b)
from (query to produce intermediate table)
where c < ( select avg(a)
from (query to produce intermediate table)
);而且,您的问题提到了一个专栏c;您的意思是a吗
更新:我今天看到a similar question和MySQL在一起;对不起,我不认识Hive。看看这是否起作用:
select stddev_pop(b)
from temp
where a < ( select *
from (select avg(a) from temp) x
);发布于 2013-12-05 14:34:50
好的,首先,配置单元只支持from子句以外的任何地方的子查询。所以你不能在where子句中使用子查询,你必须在from子句中创建一个临时表,而你可以使用该表。现在,如果您创建了一个临时表,然后在where子句中使用它来引用该临时表,那么它必须再次运行获取查询,因此它将再次不支持。
我认为配置单元不会支持这个select stddev_pop(b) from temp where a< (select * from ( select avg(a) from temp) x );
但是是的,select stddev_pop(b) from temp x join (select avg(a) as average from temp) y其中x.a < y.average;
如果我们可以物理地创建一个临时表,并将数据从temp中选择avg(a)作为平均值,那么我们就可以引用这个表。
https://stackoverflow.com/questions/13631259
复制相似问题