在蜂巢SQL嵌套查询(Nested queries in Hive SQL)

2019-08-03 07:55发布

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

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(选择从......)不被认可。 这让我真的很困惑,因为它在前面的查询。

我将不胜感激,如果有人可以提供帮助。

编辑:

我储存在我查询的结果生成中间表到一个临时表,但仍然会碰到同样的问题。 非工作查询变为:

select stddev_pop(b) from temp where a < (select avg(a) from temp);

而这个工程:

select avg(a) from temp;

Answer 1:

OK,一个同事帮我做这件事。 我会后万一有人运行到同样的问题的答案:

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

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



Answer 2:

您可能需要移动你的括号中的WHERE子句。 试试这个:

select stddev_pop(b) 
from (query to produce intermediate table) 
where c < ( select avg(a) 
            from (query to produce intermediate table)
          );

而且,你的问题是指一列c ; 您是不是要找a

更新:我看到了一个类似的问题与MySQL今天; 对不起,我不知道Hive 。 看看这个工程:

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


Answer 3:

好吧,任何地方仅比FROM子句首先蜂巢犯规支持子查询。 所以你不能在where子句你有from子句来创建临时表使用子查询,你可以使用该表。 现在,如果你创建一个临时表和比你的WHERE子句中使用它,而不是指它再次所以再次它不支持运行取查询临时表。

鲍勃我认为蜂巢不会从温度(b)中支持该选择STDDEV_POP其中<(SELECT * FROM(SELECT AVG(a)由温度)x)的;

但是选择STDDEV_POP(b)由温度X加入(选择AVG(a)作为临时平均值)y,其中XA <y.average;

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



文章来源: Nested queries in Hive SQL
标签: sql hive