如何实现去重值的累计(运行时)字符串聚合?
需求:累计去重字符串聚合
我不确定这个问题是否有人提过,已经尝试搜索但没找到相关内容。我想要实现仅针对去重值的累计(运行时)字符串聚合,期望的结果如下示例。之前用过string_agg函数,但它只能在用户-月份维度做聚合,没法实现累计聚合。理想状态下要按顺序排序,实在不行的话,只要能得到唯一组合也可以接受。
期望结果示例
| User | month | event | running agg |
|---|---|---|---|
| User1 | Jan | A | A |
| User1 | Feb | A | A |
| User1 | Mar | B | A+B |
| User1 | Apr | B | A+B |
| User1 | May | C | A+B+C |
| User1 | Jun | D | A+B+C+D |
| User1 | Jul | A | A+B+C+D |
| User1 | Aug | B | A+B+C+D |
| User1 | Sep | A | A+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
相关产品推荐
相关产品推荐

