【问题标题】:Presto filter array of rows inside aggregationPresto过滤聚合内的行数组
【发布时间】:2020-12-30 09:11:31
【问题描述】:

我有一组可能被点击或未被点击的展示(横幅)。我想计算 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;

这是我尝试过的查询,但它不起作用,因为 clicked 不是一列。我不清楚这是否可以在 Presto 上完成。此外,这是一种更复杂的查询方式的一部分,这就是为什么我想在聚合中进行过滤。

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    我认为您想使用过滤聚合语法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
    

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2023-02-16
      • 2017-07-03
      相关资源
      最近更新 更多