我目前有一些以下表格的数据。
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
两个查询?
答案 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支持LATERAL
和APPLY
。