Использовать оконные функции. Вы можете 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
уже число), поэтому я удалил его - вы могу добавить его обратно, если вам это нужно, по какой-то причине, о которой я не мог думать.