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

如何实现去重值的累计(运行时)字符串聚合?

需求:累计去重字符串聚合

我不确定这个问题是否有人提过,已经尝试搜索但没找到相关内容。我想要实现仅针对去重值的累计(运行时)字符串聚合,期望的结果如下示例。之前用过string_agg函数,但它只能在用户-月份维度做聚合,没法实现累计聚合。理想状态下要按顺序排序,实在不行的话,只要能得到唯一组合也可以接受。

期望结果示例

Usermontheventrunning agg
User1JanAA
User1FebAA
User1MarBA+B
User1AprBA+B
User1MayCA+B+C
User1JunDA+B+C+D
User1JulAA+B+C+D
User1AugBA+B+C+D
User1SepAA+B+C+D

解决方案(PostgreSQL环境)

可以通过嵌套窗口函数组合实现,先累计收集event、去重后再拼接成目标格式:

SELECT
    "User",
    month,
    event,
    array_to_string(
        array_distinct(
            array_agg(event) OVER (PARTITION BY "User" ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
        ),
        '+'
    ) AS "running agg"
FROM your_table
ORDER BY "User", month;

逻辑说明

  • array_agg(event) OVER (...):按用户分组,按月份顺序将当前行及之前所有行的event收集到数组中
  • array_distinct():对累计得到的数组进行去重,保留唯一的event值
  • array_to_string(..., '+'):把去重后的数组用+符号拼接成字符串,得到累计去重后的聚合结果

这个写法会保留event首次出现的顺序,符合你“按顺序排序”的理想需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:12:41