首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回每个组的前N行(Vertica/vsql)

返回每个组的前N行(Vertica/vsql)
EN

Stack Overflow用户
提问于 2013-12-10 04:03:16
回答 2查看 12.4K关注 0票数 6

熟悉的问题,但与Vertica有关。我想为每个tag_id返回基于总和(Imps)的前5个geo_country行。这是我开始的查询:

代码语言:javascript
复制
SELECT tag_id,
       geo_country,
       SUM(imps) AS imps,
       RANK() OVER (PARTITION BY tag_id ORDER BY SUM(imps) DESC) AS rank
FROM table1
WHERE tag_id IN (2013150,1981153)
AND ymd > CURRENT_DATE - 3
GROUP BY 1,
         2 LIMIT 10;

这实际上只返回WHERE子句(2013150)中第一个标记的行。我知道另一个标签的sum(imps)值足够高,应该将其包含在结果中。

另外,我如何实现Top N部分?我尝试在OVER函数中添加一个LIMIT子句,但它看起来不像是一个可接受的参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-10 08:10:37

解决了。解决方案是将查询转换为子查询,然后使用WHERE子句按排名进行过滤:

代码语言:javascript
复制
SELECT * 
FROM (SELECT tag_id, geo_country, sum(imps),
    RANK() OVER (PARTITION BY tag_id ORDER BY SUM(imps) DESC) AS rank 
    FROM table1
    WHERE tag_id IN (2013150,1981153)
    AND ymd > CURRENT_DATE - 3
    GROUP BY 1,2) as t2
WHERE t2.rank <=5;
票数 10
EN

Stack Overflow用户

发布于 2016-07-15 17:49:38

我认为这里发生的情况是,group by在tag_id上对您的数据进行排序,然后在geo_country上排序。然后进行限制,获取前10条记录。如果tag_id 1至少有10个geo_countries,那么在结果中只会看到tag_id 1。按等级进行排序不会解决你的问题。

虽然在Vertica中,我不确定是否允许在排序中使用排名。

代码语言:javascript
复制
SELECT tag_id,
   geo_country,
   SUM(imps) AS imps,
   RANK() OVER (PARTITION BY tag_id ORDER BY SUM(imps) DESC) AS rank
FROM table1
WHERE tag_id IN (2013150,1981153)
AND ymd > CURRENT_DATE - 3
GROUP BY 1,
         2
ORDER BY 4
LIMIT 10;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20479626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档