6

熟悉的问题,但与 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) 值足够高,应该将其包含在结果中。

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

4

2 回答 2

10

解决了。解决方案是将查询转换为子查询,然后使用 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;
于 2013-12-10T00:10:37.273 回答
0

我认为这里发生的事情是 group by 对 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;
于 2016-07-15T09:49:37.927 回答