Presto 过滤聚合内的行数组
Presto filter array of rows inside aggregation
我有一组可能被点击或未被点击的印象(横幅)。我想计算 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 上完成。此外,这是更复杂查询方式的一部分,这就是为什么我想在聚合内部进行过滤。
我认为您想使用过滤聚合语法 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
我有一组可能被点击或未被点击的印象(横幅)。我想计算 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 上完成。此外,这是更复杂查询方式的一部分,这就是为什么我想在聚合内部进行过滤。
我认为您想使用过滤聚合语法 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