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

时间:2013-12-09 20:03:16

标签: sql vertica vsql

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

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)值足够高,应该在结果中包含它。

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

2 个答案:

答案 0 :(得分:9)

解决。解决方案是将查询转换为子查询,然后使用WHERE子句按等级进行筛选:

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;

答案 1 :(得分:0)

我认为这里发生的事情是该组通过在tag_id和geo_country上订购您的数据。然后执行限制将获得前10个记录。如果tag_id 1至少有10个geo_countries,那么您只会在结果中看到tag_id 1。不排序等级ASC解决您的问题。

我不确定在Vertica中是否允许使用排序等级。

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;