Sql 如何按转换的行对用户会话进行分组
我正在做一个简单的多渠道归因探索,并被困于分组用户会话 例如,我有一个简单的会话表:Sql 如何按转换的行对用户会话进行分组,sql,google-bigquery,Sql,Google Bigquery,我正在做一个简单的多渠道归因探索,并被困于分组用户会话 例如,我有一个简单的会话表: client channel time converted 1 social 1 0 1 cpc 2 0 1 email 3 1 1 email 4 0 1 cpc 5 1 2 organic 1 0 2 cpc 2 1 3 email 1 0 每行包含用户会话和转换列,其中显示用户是否在特定会话中转换 我需
client channel time converted
1 social 1 0
1 cpc 2 0
1 email 3 1
1 email 4 0
1 cpc 5 1
2 organic 1 0
2 cpc 2 1
3 email 1 0
每行包含用户会话和转换列,其中显示用户是否在特定会话中转换
我需要为每个用户和每次转换分组引导转换的会话,因此完美的结果应该是:
client channels time converted
1 [social,cpc,email] 3 1
1 [email,cpc] 5 1
2 [organic,cpc] 2 1
3 [email] 1 0
注意用户3,他没有转换,但我需要他的会话您需要分配一个组。为此,转换后的的逆和看起来是正确的:
select client, array_agg(channel order by time) as channels,
max(time) as time, max(converted) as converted
from (select t.*,
sum(t.converted) over (partition by t.client order by t.time desc) as grp
from t
) t
group by client, grp;
下面是BigQuery标准SQL
#standardSQL
SELECT
client,
STRING_AGG(channel ORDER BY time) channels,
MAX(time) time,
MAX(converted) converted
FROM (
SELECT *, COUNTIF(converted = 1) OVER(PARTITION BY client ORDER BY time DESC) session
FROM `project.dataset.table`
)
GROUP BY client, session
-- ORDER BY client, time
您可以使用问题中的示例数据测试、播放上述内容,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 client, 'social' channel, 1 time, 0 converted UNION ALL
SELECT 1, 'cpc', 2, 0 UNION ALL
SELECT 1, 'email', 3, 1 UNION ALL
SELECT 1, 'email', 4, 0 UNION ALL
SELECT 1, 'cpc', 5, 1 UNION ALL
SELECT 2, 'organic', 1, 0 UNION ALL
SELECT 2, 'cpc', 2, 1 UNION ALL
SELECT 3, 'email', 1, 0
)
SELECT
client,
STRING_AGG(channel ORDER BY time) channels,
MAX(time) time,
MAX(converted) converted
FROM (
SELECT *, COUNTIF(converted = 1) OVER(PARTITION BY client ORDER BY time DESC) session
FROM `project.dataset.table`
)
GROUP BY client, session
ORDER BY client, time
结果
Row client channels time converted
1 1 social,cpc,email 3 1
2 1 email,cpc 5 1
3 2 organic,cpc 2 1
4 3 email 1 0