Postgres / AWS Redshift:将数据转换为列长格式

时间:2017-04-22 13:29:53

标签: sql join subquery amazon-redshift

我目前有一些以下表格的数据。

userid |      event_time      | event_duration (secs) | first_activity | last_activity
   A      2017-01-01 02:20:34             16               E1                 E2     
   A      2017-03-01 11:23:43             12               E2                 E6
   B      2017-01-01 08:24:32             53               E1                 E4
   C      2017-01-01 23:19:21             43               E3                 E11

我想将其纳入表格:

userid |      event_time      | activity
   A      2017-01-01 02:20:34      E1
   A      2017-01-01 02:20:50      E2     
   A      2017-03-01 11:23:43      E2                
   A      2017-03-01 11:23:55      E6
   B      2017-01-01 08:24:32      E1                
   B      2017-01-01 08:25:25      E4
   C      2017-01-01 23:19:21      E3                
   C      2017-01-01 23:20:04      E11

我可以通过以下方式轻松完成:

SELECT userid, event_time, first_activity
FROM table
UNION
SELECT userid, event_time + event_duration * interval '1 seconds', last_activity
FROM table

但是,我想要一种避免使用UNION来重复查询两次的方法。有没有一种巧妙的方法来创建我需要的表单而不UNION两个查询?

1 个答案:

答案 0 :(得分:2)

这个问题只有在写完这个答案时才用Postgres标记。

您可以使用横向连接:

select v.*
from t, lateral
     (values (t.userid, t.eventtime, t.first_activity),
             (t.userid, t.eventtime + t.event_duration * interval '1 second', t.last_activity)
     ) v(userid, eventtime, activity);

作为编辑说明。你可以不用逗号写这个:

select v.*
from t cross join lateral
     (values (t.userid, t.eventtime, t.first_activity),
             (t.userid, t.eventtime + t.event_duration * interval '1 second', t.last_activity)
     ) v(userid, eventtime, activity);

, lateral是我实际上更喜欢FROM子句中的逗号的一种情况。有趣的是,SQL Server使用APPLY关键字进行横向连接。 Oracle支持LATERALAPPLY