Я не могу запустить простой выбор sql с условием where из консоли Athena. Ниже приведены подробности:
SELECT name, count(*) AS c
FROM target_reddit_movie
GROUP BY name
HAVING c > 1
ORDER BY c DESC
LIMIT 10
У меня ошибка SYNTAX_ERROR: line 1:74: Column 'c' cannot be resolved
.
Похоже, Афина не распознает имя столбца as
. Как я могу заставить его работать? Использует ли он другой синтаксис?
Процесс логически выглядит следующим образом (механизм выполнения может выбрать другую стратегию выполнения):
WHERE
применяется (если есть; WHERE
в вашем случае, конечно же, нет)GROUP BY
агрегаты рассчитываютсяHAVING
применяется к агрегированным значениям — здесь вы можете ссылаться на агрегированные значения (например, count(*)
) и столбцы GROUP BY
(например, name
в вашем случае)SELECT
применяются задания (отныне c
известно как count(*)
)ORDER BY
применяется, следовательно, он может использовать c
LIMIT
применяетсяСм. также Как работает Group by and Have и Документация Presto для SELECT
.
@PiotrFindeisen О, да, я ошибаюсь. Оператор select
выполняется после предложения having
. Спасибо.
«Выражение select
выполняется после having
» — это верно, но его легко понять неправильно, поскольку «выражения выбора (например, агрегации) оцениваются после фильтрации строк с помощью having
». Я расширил ваше объяснение, чтобы, надеюсь, быть более явным по этому поводу. Посмотрите, согласны ли вы с правками, которые я сделал.
Спасибо за понятное объяснение, с этим согласен!
в чем смысл этого ответа? проблема ОП решается заменой HAVING c > 1
на HAVING count(*) > 1
, он не просил указать последовательность применяемых ключевых слов. У меня та же проблема, кажется, Presto не поддерживает использование HAVING
с псевдонимом агрегации.
Я многое почерпнул из этого ответа, спасибо, что изложил его таким образом. По мнению @mangusta, это разница между тем, чтобы дать человеку рыбу и научить его ловить рыбу. Этот пост последний.
@autonopy дать рыбу и научить ловить рыбу - разные вопросы, и их следует рассматривать в разных темах.
Объяснение (в его нынешнем виде) неверно.
HAVING
применяется послеGROUP BY
агрегации, поэтому подсчет уже завершен.