2012-11-29 53 views
6

我有一个数据库,我用一个查询来产生一个中间表是这样的:嵌套查询

id a  b  
xx 1  2  
yy 7  11  

,我想计算B的标准差谁拥有用户< AVG(一)

我计算AVG(一)这种方式工作得很好:

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; 
+0

@Bob Duell感谢OU的编辑!这很方便。 – S4M

回答

10

好的,一位同事帮我做到了。我会后万一有人运行到同样的问题的答案:

select stddev_pop(b) 
from temp x 
join (select avg(a) as average from temp) y 
where x.a < y.average; 

蜂巢基本上没有做一个表的缓存为一个变量。

1

您可能需要移动你的括号中的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 questionMySQL;对不起,我不知道Hive。看看这个工程:

select stddev_pop(b) 
from temp 
where a < (select * 
      from (select avg(a) from temp) x 
     ); 
+0

感谢鲍勃。不幸的是,检查我的实际查询后,事实证明,我已经把在那里你mentionned括号。 – S4M

+0

这将是好得多为你后说是给你错误的完整的查询。这听起来像一个语法问题,没有看到完整的代码,很难提供帮助。 – BellevueBob

+0

相应修改,同时使用临时表来简化工作 - 也确保这不是由于我的查询生成它。 – S4M

0

好吧,首先配置单元不支持子查询任何地方只有比从条款。 所以你不能在where子句中使用子查询,你必须在from子句中创建临时表,并且可以使用该表。 现在,如果您创建临时表并且在您的where子句中使用它而不是引用该临时表,那么它必须再次运行抓取查询,因此它将不再支持。

鲍勃·我想蜂巢不会支持这个 选择STDDEV_POP(B) 从临时 其中<(从选择* (SELECT AVG(一)从临时)× );

但是 选择STDDEV_POP(b)中从 临时X 加入(选择AVG(a)作为临时平均值)y的 其中x。一个< y.average;

,如果我们能够在物理创建临时表,并把数据选择AVG(一)作为平均从临时成那么我们可以参考这个。