计算每天重复访问的登录和注销之间的时间

问题描述 投票:0回答:1

我有一个表,其中包含 Employee_id、时间和类型。

行描述:

Employee_id - Provides ID of an employee
Time - Date and Time when the event occurs for a particular event we have id in Type.
Type - Login, Logout.

我必须计算他们登录和注销时在帐户中停留的时间有多长?如果他们每天登录和注销两次,那么结果应该显示 2 行,其中包含他们每次花费的时间?如果他们在注销前有 2 次登录,请选择最高的一个

Employee_id     time                    type
504             04/03/2015 1:05:02 PM   Login
504             04/03/2015 3:26:16 PM   logout
504             04/03/2015 3:28:52 PM   Login
504             04/03/2015 3:29:04 PM   Login
504             04/03/2015 3:30:25 PM   logout
504             04/03/2015 3:31:41 PM   Login
504             04/03/2015 5:40:19 PM   logout
505             04/03/2015 5:43:40 PM   Login
505             04/03/2015 8:17:59 PM  logout
505             04/03/2015 10:07:59 PM   Login
505             04/03/2015 10:12:59 PM   Login
505             04/03/2015 11:30:59 PM  logout
504             04/04/2015 3:31:41 PM   Login
504             04/04/2015 5:40:19 PM   logout
505             04/04/2015 5:43:40 PM   Login
505             04/04/2015 10:07:59 PM  logout

我期待这张桌子:

Employee_id     date             login_time              logout_time
504             04/03/2015       04/03/2015 1:05:02 PM   04/03/2015 3:26:16 PM 
504             04/03/2015       04/03/2015 3:29:04 PM.  04/03/2015 3:30:25 PM
504             04/03/2015       04/03/2015 3:29:04 PM.  04/03/2015 3:30:25 PM
504             04/03/2015       04/03/2015 3:31:41 PM.  04/03/2015 5:40:19 PM
505             04/03/2015       04/03/2015 5:43:40 PM.  04/03/2015 8:17:59 PM
505             04/03/2015       04/03/2015 10:12:59 PM  04/03/2015 11:30:59 PM

我尝试了这段代码,但它只保留了最早的登录时间和最晚的注销时间:

SELECT DISTINCT Employee_id,
                CAST(time AS date) AS Date,
MIN(time) OVER (PARTITION BY Employee_id, CAST(time AS date) ORDER BY type) AS login_time,
MAX(time) OVER (PARTITION BY Employee_id, CAST(time AS date) ORDER BY type DESC) AS logout_time
from my_table
sql postgresql greatest-n-per-group
1个回答
0
投票

通过按 降序 顺序运行窗口函数来对每次注销形成组,对注销进行计数。然后从每个组中选择最新的登录名:

SELECT employee_id, ts::date
     , max(ts) FILTER (WHERE type = 'Login')  AS login_time
     , max(ts) FILTER (WHERE type = 'logout') AS logout_time
FROM  (
   SELECT *, count(*) FILTER (WHERE type = 'logout') OVER (PARTITION BY employee_id, ts::date ORDER BY ts DESC) AS grp
   FROM   tbl
   ) sub
GROUP  BY employee_id, ts::date, grp
ORDER  BY employee_id, ts::date, login_time;

小提琴

我对

timestamp
列使用名称“ts”,而不是(误导性的)基本类型名称“time”。

© www.soinside.com 2019 - 2024. All rights reserved.