[英]Concatenate Strings from same column in Trino based on two identifiers
我想根据标识符连接来自同一列的字符串。 例如,给定表格:
时间戳 | ID | 事件类型 |
---|---|---|
2021-04-17 01:51:44 | 一个 | 登录 |
2021-04-17 01:58:43 | 一个 | 支付 |
2021-04-17 02:01:32 | 乙 | 登录 |
2021-04-17 02:15:44 | 一个 | 登录 |
2021-04-17 02:57:44 | 一个 | 支付 |
2021-04-17 02:59:44 | 乙 | 登录 |
2021-04-17 03:15:44 | 乙 | 支付 |
2021-04-17 03:27:44 | 一个 | 登录 |
2021-04-17 03:31:44 | 一个 | 支付 |
2021-04-17 03:45:44 | 乙 | 登录 |
2021-04-17 03:52:44 | 乙 | 支付 |
2021-04-17 04:01:44 | 乙 | 支付 |
2021-04-17 04:23:44 | 一个 | 登录 |
我希望我的查询返回:
事件序列 | ID_sequence |
---|---|
登录,支付 | 一个,一个 |
登录 | 乙 |
登录,支付 | 一个,一个 |
登录,支付 | 乙,乙 |
登录,支付 | 一个,一个 |
登录、支付、支付 | 乙,乙,乙 |
登录 | 一个 |
我正在考虑自引用该列并使用滞后 function 来检查两个标识符是否相同,例如:
select case when ID = lag(ID,1) over (partition by ID order by datetime asc)
then event_type || ',' || lag(event_sequence, 1) over (partition by ID order by datetime asc)
as event_sequence,
case case when ID = lag(ID,1) over (partition by ID order by datetime asc)
then ID || ',' || lag(ID_sequence, 1) over (partition by ID order by datetime asc)
as ID_sequence
from table
但我认为不支持自引用。 CTE 可以帮助我得到它吗?
提前谢谢大家!
这是一个差距和孤岛问题。 我建议使用 arrays 而不是字符串进行聚合。 要识别组,请使用不同的行号。 然后聚合:
select id,
array_agg(event_type order by timestamp)
from (select t.*,
row_number() over (order by timestamp) as seqnum,
row_number() over (partition by id order by timestamp) as seqnum_2
from t
) t
group by id, (seqnum - seqnum_2);
我不确定是否需要 id 序列,但如果你也想看到它被复制,你可以输入array_agg(id)
。 如果您喜欢字符串,您可以使用array_join()
轻松地将数组转换为字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.