BigQuery - 连接列的所有行直到达到特定值
BigQuery - concatenate all rows of column until particular value reached
我想连接特定列的所有行,直到达到某个值。
所以在我的示例中,我想使用“>”作为分隔符连接 'PageType' 列,直到到达字符串值为 'Checkout'
的行
User's page type journey
它应该看起来像这样:
主页 > PLP > PDP > PLP > PDP > PLP > PDP > Checkout
提前致谢。
基本上,聚合前过滤:
select visitid,
string_agg(pagetype, '>' order by time) as checkout_path
from (select t.*,
min(case when pagetype = 'Checkout' then time end) over (partition by visitid) as checkout_time
from t
) t
where time <= checkout_time
group by visitid;
以下适用于 BigQuery 标准 SQL
#standardSQL
SELECT visitId,
SPLIT(path, ' > Checkout')[OFFSET(0)] || ' > Checkout' path
FROM (
SELECT visitId,
STRING_AGG(PageType, ' > ' ORDER BY time) AS path
FROM `project.dataset.table`
GROUP BY visitId
)
WHERE path LIKE '% > Checkout'
当应用于您问题中的示例数据时 - 输出为
Row visitId path
1 1597865846 Home > PLP > PDP > PLP > PDP > PLP > PDP > Checkout
我看到您使用了 Google 分析数据,所以我使用了公开可用的示例数据。我写了一个子查询(包含另一个 sub-query 作为停止条件),而不是不必要的横向 cross-join 和命中。
DECLARE stopPage DEFAULT '/basket.html';
SELECT
fullvisitorid,
visitstarttime,
(SELECT STRING_AGG(page.pagePath, ' > ' ORDER BY time ASC) FROM UNNEST(hits)
WHERE type = 'PAGE'
AND time <= (select min(time) from unnest(hits) where page.pagePath=stopPage)) AS path
#ARRAY(SELECT AS STRUCT ecommerceAction, page FROM UNNEST(hits) WHERE type = 'PAGE' ) AS hits
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801`
WHERE exists(SELECT 1 FROM unnest(hits) WHERE page.pagePath=stopPage)
LIMIT 1000
因为没有页面类型,所以我使用了页面路径(我随机选择了/basket.html)——我想你可以很容易地调整条件。
您可以运行这个查询来查看结果。
我想连接特定列的所有行,直到达到某个值。
所以在我的示例中,我想使用“>”作为分隔符连接 'PageType' 列,直到到达字符串值为 'Checkout'
的行User's page type journey
它应该看起来像这样: 主页 > PLP > PDP > PLP > PDP > PLP > PDP > Checkout
提前致谢。
基本上,聚合前过滤:
select visitid,
string_agg(pagetype, '>' order by time) as checkout_path
from (select t.*,
min(case when pagetype = 'Checkout' then time end) over (partition by visitid) as checkout_time
from t
) t
where time <= checkout_time
group by visitid;
以下适用于 BigQuery 标准 SQL
#standardSQL
SELECT visitId,
SPLIT(path, ' > Checkout')[OFFSET(0)] || ' > Checkout' path
FROM (
SELECT visitId,
STRING_AGG(PageType, ' > ' ORDER BY time) AS path
FROM `project.dataset.table`
GROUP BY visitId
)
WHERE path LIKE '% > Checkout'
当应用于您问题中的示例数据时 - 输出为
Row visitId path
1 1597865846 Home > PLP > PDP > PLP > PDP > PLP > PDP > Checkout
我看到您使用了 Google 分析数据,所以我使用了公开可用的示例数据。我写了一个子查询(包含另一个 sub-query 作为停止条件),而不是不必要的横向 cross-join 和命中。
DECLARE stopPage DEFAULT '/basket.html';
SELECT
fullvisitorid,
visitstarttime,
(SELECT STRING_AGG(page.pagePath, ' > ' ORDER BY time ASC) FROM UNNEST(hits)
WHERE type = 'PAGE'
AND time <= (select min(time) from unnest(hits) where page.pagePath=stopPage)) AS path
#ARRAY(SELECT AS STRUCT ecommerceAction, page FROM UNNEST(hits) WHERE type = 'PAGE' ) AS hits
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801`
WHERE exists(SELECT 1 FROM unnest(hits) WHERE page.pagePath=stopPage)
LIMIT 1000
因为没有页面类型,所以我使用了页面路径(我随机选择了/basket.html)——我想你可以很容易地调整条件。
您可以运行这个查询来查看结果。