You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery标准SQL中按条件生成parent_ListViewID列的实现

解决BigQuery中新增parent_ListViewID列的问题

原始生成表格

sessionIDhitNumberListViewIDPositionSponsoredisClickimpressionsclicks
aaa202304251aaa20230425-121false10
bbb202304251bbb20230425-160false10
bbb202304251bbb20230425-170false10
bbb202304251bbb20230425-180false10
bbb202304251bbb20230425-190false10
bbb202304251bbb20230425-1100false10
bbb202304251bbb20230425-1110false10
aaa202304252aaa20230425-221true01
ccc202304251ccc20230425-101false10
ddd2023042517ddd20230425-1711false10

现有查询代码

SELECT
    CONCAT(fullVisitorID, CAST(visitID AS string), date) AS sessionID,
    hits.hitNumber AS hitNumber,
    CONCAT( fullvisitorID, CAST(visitId AS STRING), date, hits.hitNumber ) AS ListViewID,
    product.productListPosition AS Position,
    customDimensions.value AS Sponsored,
    (CASE
         WHEN product.isClick = TRUE THEN TRUE
         ELSE FALSE
     END) AS isClick,
    SUM(
  IF
    (product.isImpression, 1,0)) AS impressions,
  SUM(
  IF
    (product.isClick,1,0)) AS clicks
FROM
    `Table`,
UNNEST (hits) AS hits,
UNNEST (hits.product) AS product,
UNNEST (product.customDimensions) AS customDimensions
WHERE
    product.productListName IN ("searchpage", "categorypage")
    AND customDimensions.index = 68
GROUP BY
    SessionID, hitNumber, ListViewID, Position,
    Sponsored, isClick

新增parent_ListViewID列规则

  • 当isClick = false时,parent_ListViewID取值为当前行的ListViewID;
  • 当isClick = true时,parent_ListViewID取值为同一sessionID下最近一行isClick = false的ListViewID。

期望结果表格

sessionIDhitNumberListViewIDPositionSponsoredisClickimpressionsclicksparent_ListViewID
aaa202304251aaa20230425-121false10aaa20230425-1
bbb202304251bbb20230425-160false10bbb20230425-1
bbb202304251bbb20230425-170false10bbb20230425-1
bbb202304251bbb20230425-180false10bbb20230425-1
bbb202304251bbb20230425-190false10bbb20230425-1
bbb202304251bbb20230425-1100false10bbb20230425-1
bbb202304251bbb20230425-1110false10bbb20230425-1
aaa202304252aaa20230425-221true01aaa20230425-1
ccc202304251ccc20230425-101false10ccc20230425-1
ddd2023042517ddd20230425-1711false10ddd20230425-17

解决方案

通过在原查询外层嵌套窗口函数实现需求,核心利用LAST_VALUE函数追踪同一sessionID内最近的isClick=false对应的ListViewID:

WITH original_data AS (
    SELECT
        CONCAT(fullVisitorID, CAST(visitID AS string), date) AS sessionID,
        hits.hitNumber AS hitNumber,
        CONCAT( fullvisitorID, CAST(visitId AS STRING), date, hits.hitNumber ) AS ListViewID,
        product.productListPosition AS Position,
        customDimensions.value AS Sponsored,
        (CASE
             WHEN product.isClick = TRUE THEN TRUE
             ELSE FALSE
         END) AS isClick,
        SUM(IF(product.isImpression, 1,0)) AS impressions,
        SUM(IF(product.isClick,1,0)) AS clicks
    FROM
        `Table`,
    UNNEST (hits) AS hits,
    UNNEST (hits.product) AS product,
    UNNEST (product.customDimensions) AS customDimensions
    WHERE
        product.productListName IN ("searchpage", "categorypage")
        AND customDimensions.index = 68
    GROUP BY
        SessionID, hitNumber, ListViewID, Position,
        Sponsored, isClick
)
SELECT
    *,
    CASE
        WHEN isClick = FALSE THEN ListViewID
        ELSE LAST_VALUE(CASE WHEN isClick = FALSE THEN ListViewID END IGNORE NULLS) 
             OVER (PARTITION BY sessionID ORDER BY hitNumber ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    END AS parent_ListViewID
FROM original_data
ORDER BY sessionID, hitNumber, Position;

代码说明

  1. 用original_data公共表达式保存原查询结果,简化后续逻辑;
  2. 对isClick=false的行,直接返回当前行的ListViewID;
  3. 对isClick=true的行,通过LAST_VALUE函数在同一sessionID分组内,按hitNumber排序,筛选出当前行之前最近的isClick=false对应的ListViewID,IGNORE NULLS参数确保跳过isClick=true行的空值;
  4. 最终按sessionID、hitNumber和Position排序,保证结果顺序符合预期。

内容的提问来源于stack exchange,提问作者Yaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:18:07