熟悉的问题,但与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子句,但是看起来它不是一个可接受的参数。

最佳答案

解决了。解决方案是将查询转换为子查询,然后使用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;

09-29 21:25