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

如何在Google BigQuery中基于触发词条件拼接指定行数的列数据?

需求实现:触发词前N行内容拼接

原始数据

TimeStampUSER IDstring_col
1100001Here
2100001there
3100001Apple
4200002this is
5200002that is
6200002Apple
7200002some
8200002summer
9200002winter
10200002Apple

期望输出

要求以Apple为触发词,每个USER ID下触发词所在行的结果为该行前2行的string_col内容拼接,非触发词行结果为null:

TimeStampUSER IDstring_colResult
1100001Herenull
2100001therenull
3100001AppleHere there
4200002this isnull
5200002that isnull
6200002Applethis is that is
7200002somenull
8200002summernull
9200002winternull
10200002Applesummer winter

方法一:SQL实现(数据库场景)

利用窗口函数标记行号,结合聚合函数筛选触发词前N行内容:

WITH user_ranked AS (
    SELECT 
        TimeStamp,
        "USER ID" AS user_id,
        string_col,
        ROW_NUMBER() OVER (PARTITION BY "USER ID" ORDER BY TimeStamp) AS row_num
    FROM your_table
)
SELECT
    ur.TimeStamp,
    ur.user_id AS "USER ID",
    ur.string_col,
    CASE 
        WHEN ur.string_col = 'Apple' THEN (
            SELECT STRING_AGG(string_col, ' ')
            FROM user_ranked ur2
            WHERE ur2.user_id = ur.user_id
              AND ur2.row_num BETWEEN ur.row_num - 2 AND ur.row_num - 1
        )
        ELSE NULL
    END AS Result
FROM user_ranked ur
ORDER BY ur.TimeStamp;

方法二:Python Pandas实现(本地数据处理)

通过分组移位拼接内容,再按触发词条件赋值:

import pandas as pd

# 构造原始数据(实际场景可替换为pd.read_csv等读取操作)
df = pd.DataFrame({
    'TimeStamp': [1,2,3,4,5,6,7,8,9,10],
    'USER ID': [100001,100001,100001,200002,200002,200002,200002,200002,200002,200002],
    'string_col': ['Here','there','Apple','this is','that is','Apple','some','summer','winter','Apple']
})

# 分组后拼接前2行的内容
df['Result'] = df.groupby('USER ID')['string_col'].apply(
    lambda x: x.shift(2) + ' ' + x.shift(1)
)

# 非触发词行设置为null
df.loc[df['string_col'] != 'Apple', 'Result'] = None

# 输出结果
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:10:19