Sql 如何在一定条件下获得前N行
我有一个类似这样的问题:Sql 如何在一定条件下获得前N行,sql,sum,greatest-n-per-group,presto,amazon-athena,Sql,Sum,Greatest N Per Group,Presto,Amazon Athena,我有一个类似这样的问题: 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') GROU
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个产品id。当我写限制函数时,它只显示前10名的产品,但不按类别id和店铺id进行分组
如何执行此操作?使用窗口功能。您可以通过在子查询的站点/类别分区内按降序单击对记录进行排序,然后在外部查询中进行筛选:
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中需要合并/转换逻辑,就像其他聚合函数一样,sum ignore null值,而且似乎clicks已经是一个数字了,所以我删除了它-如果您确实需要它,您可以将其添加回去,原因我想不出