Фильтр Presto массив строк внутри агрегации - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть набор показов (баннеров), которые можно было или не нажать.Я хочу посчитать появления 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 Ответ

2 голосов
/ 05 апреля 2019

Я думаю, что вы хотите использовать отфильтрованный синтаксис агрегации 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
...