【问题标题】:Concatenate Strings from same column in Trino based on two identifiers根据两个标识符连接 Trino 中同一列的字符串
【发布时间】:2021-08-24 16:50:12
【问题描述】:

我想根据标识符连接来自同一列的字符串。例如,给定表格:

Timestamp ID event_type
2021-04-17 01:51:44 A login
2021-04-17 01:58:43 A payment
2021-04-17 02:01:32 B login
2021-04-17 02:15:44 A login
2021-04-17 02:57:44 A payment
2021-04-17 02:59:44 B login
2021-04-17 03:15:44 B payment
2021-04-17 03:27:44 A login
2021-04-17 03:31:44 A payment
2021-04-17 03:45:44 B login
2021-04-17 03:52:44 B payment
2021-04-17 04:01:44 B payment
2021-04-17 04:23:44 A login

我希望我的查询返回:

event_sequence ID_sequence
login, payment A, A
login B
login, payment A, A
login, payment B, B
login, payment A, A
login, payment, payment B, B, B
login A

我正在考虑自引用该列并使用 lag 函数检查两个标识符是否相同,例如:

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 可以帮助我获得它吗?

提前感谢大家!

【问题讨论】:

    标签: sql presto trino


    【解决方案1】:

    这是一个孤岛问题。我建议使用数组而不是字符串进行聚合。要识别组,请使用不同的行号。然后聚合:

    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() 轻松地将数组转换为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2013-11-05
      相关资源
      最近更新 更多