我有一个表,其中包含 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
通过按 降序 顺序运行窗口函数来对每次注销形成组,对注销进行计数。然后从每个组中选择最新的登录名:
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”。