Расчет верхних N элементов по измерению

#sql #amazon-web-services #amazon-athena #presto

Вопрос:

У меня есть следующий запрос, который показывает общий объем продаж по каждому продукту на почасовой основе. Тем не менее, это очень большие данные, и я не хочу видеть все продукты, поэтому хотел бы видеть топ-1000 product_id на основе sales для каждого date , hour , и category_id измерений.

 SELECT date,
         hour,
         category_id,
         product_id,
         sum(sales) AS sales
FROM  a
LEFT JOIN 
    ON a.product_id = b.product_id
WHERE date(date) >= date('2021-01-01')
GROUP BY  1, 2, 3, 4
 

Как это сделать в Афине?

Заранее спасибо.

Ответ №1:

Вы можете использовать rank функцию для своего результата, а затем отфильтровать соответствующие ранги:

 SELECT date,
         hour,
         category_id,
         product_id,
         sales
FROM
(
    SELECT *,          
        rank() OVER (PARTITION BY date, hour, category_id
                    ORDER BY sales DESC) AS rnk
    FROM (your query)
)
WHERE rnk <= 1000
 

Комментарии:

1. Привет @Guru, спасибо за ваш ответ. Запрос выдает следующую ошибку: столбец «час» не может быть разрешен. Что вы об этом думаете?

2. @datazang это работает просто отлично. Не уверен, чего вам не хватает в вашем запросе.