gpt4 book ai didi

sql - 如何获得不同值的运行(累积)字符串聚合

转载 作者:行者123 更新时间:2023-12-03 07:53:33 26 4
gpt4 key购买 nike

不确定以前是否有人问过这个问题,尝试搜索它但找不到任何相关内容。

我试图获得一个累积的字符串聚合,即仅运行不同值的聚合。这是我正在寻找的结果的示例。

我尝试使用 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

最佳答案

可能还有其他有效的方法,但下面的递归方法将是您问题的一种选择。

-- sample table
CREATE TEMP TABLE sample_table AS
SELECT 'User1' user, month, event
FROM UNNEST(GENERATE_ARRAY(1, 9)) month WITH offset
JOIN UNNEST(SPLIT('AABBCDABA', '')) event WITH offset USING (offset);

-- recursive query starts here
WITH RECURSIVE sample_table0 AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user ORDER BY month) rn
FROM sample_table
),
aggs AS (
SELECT *, [event] running_agg FROM sample_table0 WHERE rn = 1
UNION ALL
SELECT t.*,
IF(t.event IN UNNEST(a.running_agg), a.running_agg, a.running_agg || [t.event])
FROM aggs a JOIN sample_table0 t ON a.rn + 1 = t.rn
)
SELECT * EXCEPT(rn) REPLACE(ARRAY_TO_STRING(running_agg, '+') AS running_agg)
FROM aggs
ORDER BY user, month;

-- query result
+-------+-------+-------+-------------+
| user | month | event | running_agg |
+-------+-------+-------+-------------+
| User1 | 1 | A | A |
| User1 | 2 | A | A |
| User1 | 3 | B | A+B |
| User1 | 4 | B | A+B |
| User1 | 5 | C | A+B+C |
| User1 | 6 | D | A+B+C+D |
| User1 | 7 | A | A+B+C+D |
| User1 | 8 | B | A+B+C+D |
| User1 | 9 | A | A+B+C+D |
+-------+-------+-------+-------------+

关于sql - 如何获得不同值的运行(累积)字符串聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76569116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com