Как исправить 'должно быть агрегатным выражением или появиться в предложении GROUP BY' с 'предложением as' - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь получить количество запросов по часам моего дистрибутива CloudFront, используя запрос athena.

Я создал таблицу cloudfront_logs, руководствуясь этой ссылкой в моем sample_db

Ниже приведен запрос, который я получил, чтобы получить номер запроса по часам

SELECT date_trunc('hour',from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time))) as TIME, count(*) as CNT
FROM "sample_db"."cloudfront_logs" 
WHERE 
    from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time)) >= from_iso8601_timestamp('2019-05-29T00:00:00')
AND 
    from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time)) < from_iso8601_timestamp('2019-05-30T00:00:00')
GROUP BY TIME
ORDER BY TIME ASC;

Однако он возвращает ошибку, подобную этой

SYNTAX_ERROR: line 2:8: '"date_trunc"('hour', "from_iso8601_timestamp"("concat"("concat"("date_format"("date", '%Y-%m-%d'), 'T'), "time")))' must be an aggregate expression or appear in GROUP BY clause

Поэтому я заменил TIME после GROUP BY на date_trunc('hour',from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time))) и попытался снова.

SELECT date_trunc('hour',from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time))) as TIME, count(*) as CNT
FROM "sample_db"."cloudfront_logs" 
WHERE 
    from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time)) >= from_iso8601_timestamp('2019-05-29T00:00:00')
AND 
    from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time)) < from_iso8601_timestamp('2019-05-30T00:00:00')
GROUP BY date_trunc('hour',from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time)))
ORDER BY TIME ASC;

Наконец-то я получил результат.

Я думаю, это должно работать и с первым запросом. Могу ли я получить совет по первому запросу? Потому что выглядит проще.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Афина основана на Престо. В Presto нельзя использовать псевдонимы столбцов предложения SELECT в предложении GROUP BY. Тем не менее, вы можете использовать идентичные выражения, например:

SELECT some_expression(a) FROM ... GROUP BY some_expression(a)

Кроме того, вы можете ссылаться на SELECT столбцы предложения, используя их положение в списке SELECT:

SELECT some_expression(a) FROM ... GROUP BY 1

Это стандартный синтаксис ANSI SQL. Подробнее о режиме см. Presto GROUP BY .

Это можно использовать и в ORDER BY, поэтому ваш запрос будет выглядеть примерно так:

SELECT date_trunc('hour',from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time))) as TIME, count(*) as CNT
FROM "sample_db"."cloudfront_logs" 
WHERE ...
GROUP BY 1
ORDER BY 1 ASC;
1 голос
/ 31 мая 2019

Похоже, что Athena SQL не делает псевдоним, используемый в предложении SELECT, доступным в предложении GROUP BY на том же уровне.Однако многие версии SQL допускают это.Вы можете попробовать использовать CTE здесь, чтобы сделать вещи менее подробными:

WITH cte AS (
    SELECT from_iso8601_timestamp(concat(concat(date_format(date, '%Y-%m-%d'), 'T'), time)) AS ts
    FROM "sample_db"."cloudfront_logs"
)

SELECT
    DATE_TRUNC('hour', ts) AS TIME,
    COUNT(*) AS CNT
FROM cte
WHERE
    ts >= from_iso8601_timestamp('2019-05-29T00:00:00') AND
    ts <  from_iso8601_timestamp('2019-05-30T00:00:00')
GROUP BY
    DATE_TRUNC('hour', ts)
ORDER BY
    DATE_TRUNC('hour', ts);
...