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

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_idtstamp_trueevent_namespaceappended_event_namespace(预期结果)
10012024-05-01 09:00:00ApplicationLaunchApplicationLaunch
10012024-05-01 09:05:00CategoryBrowseApplicationLaunch/CategoryBrowse
10012024-05-01 09:10:00NotificationCenterApplicationLaunch/CategoryBrowse/NotificationCenter
10012024-05-01 09:15:00UserProfileApplicationLaunch/CategoryBrowse/NotificationCenter/UserProfile

使用修正后的语句就能得到上面预期的appended_event_namespace列,每行只包含到当前行为止的累积路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:46:40