8

私はデータベースを持っており、クエリを使用して次のような中間テーブルを作成します。

id    a      b    
xx    1      2    
yy    7      11    

そして、<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(select a from ...)の「a」が認識されないと言われます。これは前のクエリで機能するため、私は本当に混乱します。

誰かが助けてくれたらありがたいです。

編集:

クエリの結果を保存して中間テーブルを一時テーブルに生成しましたが、それでも同じ問題が発生します。動作しないクエリは次のようになります。

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

これが機能している間:

select avg(a) from temp;
4

3 に答える 3

13

OK、同僚が私にそれをするのを手伝ってくれました。誰かが同じ問題に遭遇した場合に備えて、回答を投稿します。

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

基本的に、ハイブはテーブルを変数としてキャッシュしません。

于 2012-11-30T10:27:14.720 に答える
0

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
          );
于 2012-11-29T17:43:26.137 に答える
0

わかりました。まず、ハイブはfrom句以外のサブクエリをサポートしていません。したがって、where句でサブクエリを使用することはできません。from句で一時テーブルを作成する必要があり、そのテーブルを使用できます。ここで、一時テーブルを作成し、その一時テーブルを参照するよりもwhere句で使用している場合は、フェッチクエリを再度実行する必要があるため、をサポートしません。

ボブハイブはこのselectstddev_pop(b)from tempをサポートしないと思います。ここでa<(select * from(select avg(a)from temp)x);

ただし、はい、temp x joinからstddev_pop(b)を選択します(tempからの平均としてavg(a)を選択します)yここで、xa <y.average;

一時テーブルを物理的に作成し、そのデータに平均としてavg(a)を選択できる場合は、これを参照できます。

于 2013-12-05T06:34:49.670 に答える