Вложенные запросы в 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 в это, то мы можем ссылаться на это .