Как получить топ N строк с некоторыми условиями - PullRequest
0 голосов
/ 29 февраля 2020

У меня запрос примерно такой:

SELECT product_id,
         site,
         category_id,
         session_time,
         sum(cast(coalesce("#clicks",
         0) AS bigint)) AS clicks
FROM df
WHERE site IN ('com', 'co')
        AND session_time = DATE('2020-02-27')
GROUP BY  product_id, site, session_time, category_id
ORDER BY clicks desc
LIMIT 10

Но теперь я хочу увидеть top 10 product_id для каждого сайта и category_id на основе кликов. Когда я пишу функцию LIMIT, она показывает только 10 лучших продуктов, но не группирует ее по category_id и shop_id.

Как я могу это сделать?

1 Ответ

1 голос
/ 29 февраля 2020

Использовать оконные функции. Вы можете RANK() записей, убрав clicks в пределах site / category разделов в подзапросе, а затем отфильтровав во внешнем запросе:

SELECT *
FROM (
    SELECT 
        product_id,
        site,
        category_id,
        session_time,
        SUM("#clicks") clicks,
        RANK() OVER(PARTITION BY site, category_id ORDER BY sum("#clicks") DESC) rn
    FROM df
    WHERE 
        site IN ('com', 'co')
        AND session_time = DATE('2020-02-27')
    GROUP BY  product_id, site, session_time, category_id
) t
WHERE rn <= 10
ORDER BY site, category, clicks desc

Мне неясно, зачем вам нужен coalesce() / cast() logi c в sum() (как и в других агрегатных функциях, sum() игнорирует null значения, и кажется, что #clicks уже число), поэтому я удалил его - вы могу добавить его обратно, если вам это нужно, по какой-то причине, о которой я не мог думать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...