如何在某些条件下获得前 N 行

How to get top N rows with some conditions

我有这样的查询:

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

但现在,我想查看每个站点的 前 10 product_id 和基于点击次数的 category_id。当我编写 LIMIT 函数时,它只显示前 10 个产品,但没有按 category_id 和 shop_id 分组。

我该怎么做?

使用window 函数。您可以通过在子查询的 site/category 分区内降序 clicksRANK() 记录,然后在外部查询中过滤:

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

我不清楚你为什么需要 sum() 中的 coalesce()/cast() 逻辑(就像其他聚合函数一样,sum() 忽略 null值,并且 #clicks 似乎已经是一个数字),所以我删除了它 - 如果您确实需要它,您可以将它添加回来,出于某种我无法想到的原因。