聚合内的行的Presto过滤器数组

时间:2019-04-03 21:48:08

标签: sql presto

我有一组可能被点击或未被点击的印象(横幅)。我只想统计ips的出现次数,但只计算那些被点击的印象。

WITH imps AS (
  SELECT
    day,
    source_id,
    ip,
    trans_id
  FROM
    xxx
),
clicks AS (
  SELECT 
    day,
    trans_id,
    1 AS clicked,
  FROM
    yyy
)

SELECT
  imps.source_id as source_id,
  histogram(
    filter(zip(array_agg(ip), array_agg(clicked)), x -> x.clicked = 1)
  ) as ip_hist
FROM
  imps
LEFT JOIN
  clicks
    ON imps.trans_id = clicks.trans_id
GROUP BY
  imps.source_id;

这是我尝试的查询,但由于单击不是一列而无法使用。我不清楚这是否可以在Presto上完成。另外,这是更复杂的查询方式的一部分,这就是为什么我要在聚合内进行过滤。

1 个答案:

答案 0 :(得分:2)

我认为您想使用过滤后的聚合语法agg_function(...) filter (where expression),该语法会在将值添加到特定函数之前立即应用过滤器。此外,您可以在子查询中使用in子句来消除查询中的联接。

我相信这就是您想要的:

WITH
 imps(source_id, ip, trans_id) AS (
     VALUES
         (1, 1, 1),
         (2, 2, 2),
         (3, 3, 3)
),
clicks(trans_id) AS (
    VALUES 1, 3
)
SELECT source_id,
    histogram(ip) filter (where trans_id in (select trans_id from clicks))
FROM imps
GROUP BY source_id