我有一个UserActivity表,其中包含UserID、DateTime和Activity列。表结构为:
Id UserID DateTime Activity
123 abc 2023-08-24 09:30:50 Login
125 abc 2023-08-24 09:34:23 Login
150 abc 2023-08-24 09:38:04 Logout
178 abc 2023-08-24 13:23:12 Login
200 abc 2023-08-24 15:50:34 Logout
300 abc 2023-08-24 16:43:02 Login
505 abc 2023-08-25 10:32:12 Login
507 abc 2023-08-25 12:36:44 Logout
我要输出,这将返回所有的登录日期与它的通讯注销日期。如果特定登录的注销日期时间不存在,则它应该为空。
输出:
UserID LoginDateTime LogoutDateTime
abc 2023-08-24 09:30:50
abc 2023-08-24 09:34:23 2023-08-24 09:38:04
abc 2023-08-24 13:23:12 2023-08-24 15:50:34
abc 2023-08-24 16:43:02
abc 2023-08-25 10:32:12 2023-08-25 12:36:44
我已经尝试了下面的查询,但它没有给出正确的输出.
*SELECT
login.UserID,
login.DateTime As Login,
LogOut.DateTime As Logout
from
UserActivity login
Left JOIN
UserActivity LogOut ON Login.UserID=Logout.UserID
AND login.Activity='login.label'
AND Logout.Activity='logout.label'
AND TO_CHAR(Login.DateTime, 'YYYY-MM-DD') = TO_CHAR(Logout.DateTime, 'YYYY-MM-DD')
AND Login.DateTime<Logout.DateTime
Where login.UserID='abc'
Order by login.UserID,login.DateTime;*
请帮助实现上述结果。
2条答案
按热度按时间hjzp0vay1#
不需要自联接表;使用
LEAD
解析函数更有效:其中,对于样本数据:
输出:
| userId|登录时间|登录日期时间|
| --|--|--|
| ABC| 2023-08-24 09:30:50| * 空 *|
| ABC| 2023-08-24 09:34:23| 2023-08-24 09:38:04|
| ABC| 2023-08-24 13:23:12| 2023-08-24 15:50:34|
| ABC| 2023-08-24 16:43:02| * 空 *|
| ABC| 2023-08-25 10:32:12| 2023-08-25 12:36:44|
fiddle
nukf8bse2#