2012-11-29 17 views
6

私はデータベースを持っている、と私はこのような中間テーブルを作成するクエリを使用します。ネストされたクエリ

id a  b  
xx 1  2  
yy 7  11  

と私が持っているユーザーのために、Bの標準偏差を計算したいと思います< AVGは(a)の

私は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 stddev_pop(b) from temp where a < (select avg(a) from temp); 

をこの作品ながら:

select avg(a) from temp; 
+0

@Bob Duell編集に感謝!そんなに丁寧に – S4M

答えて

10

OK、同僚が私の手助けをしました。誰かが同じ問題に遭遇した場合に回答を投稿します:

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 questionと今日はMySQLです。すみません、私はHiveを知らないのです。これが動作するかどうかを確認してください:

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

ありがとうございました。残念ながら、私の実際のクエリを確認した後、私はすでにあなたが言及した括弧を入れていることが判明します。 – S4M

+0

エラーを出す完全なクエリを投稿する方がずっと良いでしょう。それは構文上の問題のように聞こえ、完全なコードを見ることなく、手助けするのは難しいです。 – BellevueBob

+0

が編集されていますが、一時テーブルを使用して作業を簡素化し、それを生成するためのクエリによるものではありません。 – S4M

0

大丈夫です。まず、ハイブは、from句以外の部分クエリをサポートしていません。 where句でサブクエリを使用することはできません。from句で一時テーブルを作成する必要があり、そのテーブルを使用できます。 一時テーブルを作成し、whereテーブルを使用してtempテーブルを参照するよりも、フェッチクエリを再度実行しなければならないため、再度サポートされません。

ボブ私はハイブが<一時 から(b)の この 選択STDDEV_POPをサポートしていないだろうと思います( をX(一時からAVG(A)]を選択)SELECT * FROM)。

しかしはい一時X から選択STDDEV_POP(B) は(TEMPから平均値として平均(A)を選択)Y Xに参加します。a。平均;

物理的に一時テーブルを作成し、その平均値としてavg(a)を平均からtempにすることができれば、これを参照できます。