如何在某些条件下获得前 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
分区内降序 clicks
来 RANK()
记录,然后在外部查询中过滤:
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
似乎已经是一个数字),所以我删除了它 - 如果您确实需要它,您可以将它添加回来,出于某种我无法想到的原因。
我有这样的查询:
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
分区内降序 clicks
来 RANK()
记录,然后在外部查询中过滤:
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
似乎已经是一个数字),所以我删除了它 - 如果您确实需要它,您可以将它添加回来,出于某种我无法想到的原因。