繁体   English   中英

根据两个标识符连接 Trino 中同一列的字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM