时间戳 | 用户ID | string_col |
---|---|---|
1 | 100001 | 这里 |
2 | 100001 | 那里 |
3 | 100001 | 苹果 |
4 | 200002 | 这是 |
5 | 200002 | 就是这样 |
6 | 200002 | 苹果 |
7 | 200002 | 一些 |
8 | 200002 | 夏天 |
9 | 200002 | 冬天 |
10 | 200002 | 苹果 |
11 | 200002 | 苹果 |
这是我的原始表,我想使用单词“Apple”作为触发词来为每个用户 ID 连接上面的 N 行(在本例中为 2)行。
下表是我正在寻找的输出:
时间戳 | 用户ID | string_col | 结果 |
---|---|---|---|
1 | 100001 | 这里 | 空 |
2 | 100001 | 那里 | 空 |
3 | 100001 | 苹果 | 这里 |
4 | 200002 | 这是 | 空 |
5 | 200002 | 就是这样 | 空 |
6 | 200002 | 苹果 | 这个就是那个 |
7 | 200002 | 一些 | 空 |
8 | 200002 | 夏天 | 空 |
9 | 200002 | 冬天 | 空 |
10 | 200002 | 苹果 | 夏天冬天 |
11 | 200002 | 苹果 | 夏天冬天 |
使用下面
SELECT * EXCEPT(grp),
CASE
WHEN string_col = 'Apple'
THEN STRING_AGG(string_col, ' ') OVER win
END AS Result
FROM (
SELECT *,
COUNTIF(string_col = 'Apple') OVER win AS grp
FROM your_table
WINDOW win AS (PARTITION BY user_id ORDER BY ts ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
)
WINDOW win AS (PARTITION BY user_id, grp ORDER BY ts ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
有输出