Вложенные запросы в Hive SQL

у меня есть база данных, и я использую запрос для создания промежуточной таблицы, как это:

id    a      b    
xx    1      2    
yy    7      11    

и я хотел бы рассчитать стандартные отклонения b для пользователей, у которых есть 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);

возвращает мне ошибку, а точнее, мне говорят, что "a" из avg(выберите a из...) не признается. Это меня действительно смущает, так как это работает в предыдущем запросе.

Я был бы благодарен, если бы кто-нибудь мог помочь.

EDIT:

Я сохранил результат моего запроса для создания промежуточной таблицы во временную таблицу, но все равно столкнулся с той же проблемой. Не работает запрос:

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

в то время как это работает:

select avg(a) from temp;

3 ответов


хорошо, коллега помог мне это сделать. Я отправлю ответ, если кто-то столкнется с той же проблемой:

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

в основном hive не выполняет кэширование таблицы как переменной.


вам, вероятно, нужно переместить скобки в свой 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
          );

ok, прежде всего hive не поддерживает подзапросы нигде, кроме предложения from. поэтому вы не можете использовать подзапрос в предложении where для создания временной таблицы в предложении from, и вы можете использовать эту таблицу. Теперь, если вы создаете временную таблицу и используете ее в своем предложении where, чем ссылаться на эту временную таблицу, она должна снова запустить запрос выборки, чтобы снова не поддерживать .

Боб, Я думаю, что куст не будет поддерживать это выберите stddev_pop(b) от темп где

Но да выберите stddev_pop(b) от temp x присоединиться (выберите avg (a) как среднее из temp) y где x.a

Если мы можем создать временную таблицу физически и поместить данные, выберите avg(a) как среднее значение от temp в это, то мы можем ссылаться на это .