Redshift中如何仅对分区内前置行进行字符串聚合?
解决LISTAGG累积聚合前置行的问题
你现在遇到的问题是因为默认的窗口函数范围覆盖了整个分区,所以LISTAGG会把分区内所有行的event_namespace全部聚合起来。要实现只聚合当前行及之前的前置行,只需要在OVER子句里明确指定窗口的范围即可。
修正后的SQL语句
LISTAGG(event_namespace, '/') WITHIN GROUP (ORDER BY tstamp_true) OVER ( PARTITION BY acct_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS appended_event_namespace
原理说明
PARTITION BY acct_id依然按账号分区,保证聚合只在同一个账号范围内进行ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW是核心调整:它限定了窗口范围是从当前分区的第一行(UNBOUNDED PRECEDING)一直到当前行(CURRENT ROW),这样LISTAGG就只会对这个范围内的event_namespace进行拼接,形成累积的路径字符串。
举个实际数据的例子,假设你的原始数据如下:
| acct_id | tstamp_true | event_namespace | appended_event_namespace(预期结果) |
|---|---|---|---|
| 1001 | 2024-05-01 09:00:00 | ApplicationLaunch | ApplicationLaunch |
| 1001 | 2024-05-01 09:05:00 | CategoryBrowse | ApplicationLaunch/CategoryBrowse |
| 1001 | 2024-05-01 09:10:00 | NotificationCenter | ApplicationLaunch/CategoryBrowse/NotificationCenter |
| 1001 | 2024-05-01 09:15:00 | UserProfile | ApplicationLaunch/CategoryBrowse/NotificationCenter/UserProfile |
使用修正后的语句就能得到上面预期的appended_event_namespace列,每行只包含到当前行为止的累积路径。
内容的提问来源于stack exchange,提问作者cvax
相关产品推荐
相关产品推荐

