2017-03-12 133 views
-1

我有一张桌子,我在一台机器上管理用户登录。根据活动类型,我确定它是否是登录或注销。我被要求生成关于用户登录/注销的报告。它适用于所有班次,但不适用于午夜班次。需要查询咨询

样品表:

User_id Activity_code timestamp 
1  login   2016-03-28 11:10:00 
1  logout  2016-03-28 19:45:00 
2  login   2017-02-15 23:00:00 
2  logout  2017-02-16 07:00:00 

如果我按时间戳,我得到的报告正确地为用户ID1,而不是用户2

desc pmevents_bkp 

Name   Null? Type 
------------- ------- -------------- 
EVENTTYPE  NOT NULL NUMBER(4) 
USERID     CHAR(32) 
JOBNUMBER    NUMBER(11) 
TIMESTAMP  NOT NULL DATE 
SEQUENCENUMBER   NUMBER(8) 

SQL >select * from pmevents_bkp; 

EVENTTYPE USERID       JOBNUMBER TIMESTAMP SEQUENCENUMBER 
---------- -------------------------------- ---------- --------- -------------- 
     101 JBOND 007        12345 11-MAR-17   12345 
     101 JBOND 007        12345 12-MAR-17   12345 
     101 JBOND 008        3245 11-MAR-17   3245 
     100 JBOND 007        12345 11-MAR-17   3245 

SQL >select to_char(timestamp, 'MM/DD/YYYY'), 
    2 userid, 
    3 MIN(timestamp) KEEP (DENSE_RANK FIRST ORDER BY eventtype) "Login", 
    4 MAX(timestamp) KEEP (DENSE_RANK LAST ORDER BY eventtype) "Logout" 
    5  FROM pmevents_bkp 
    6  where timestamp BETWEEN TO_DATE('01-mar-17','DD-MON-YY') AND TO_DATE('30-mar-17','DD-MON-YY') 
    7 and (eventtype = '100' 
    8 or eventtype = '101') 
    9 group by to_char(timestamp, 'MM/DD/YYYY'),userid; 

TO_CHAR(TI USERID       Login  Logout 
---------- -------------------------------- --------- --------- 
03/11/2017 JBOND 007      11-MAR-17 11-MAR-17 
03/11/2017 JBOND 008      11-MAR-17 11-MAR-17 
03/12/2017 JBOND 007      12-MAR-17 12-MAR-17 
+4

什么是正确的结果?你试过什么查询?不要害羞。 –

+1

您是否意味着您想按登录时间戳进行分组,并将登出时间戳与匹配的登录时间戳相关联,而不管第二天是否登出? – marcothesane

+0

同一个user_id只能登录和登出一次吗?或每天一次?或每天几次? – marcothesane

回答

0

这工作,无论是否有多个登录/从每天或者注销丢失:

select * 
from 
(
    select User_id, 

     -- login timestamp 
     case when Activity_code = 'login' then timestamp end as Login, 

     -- next row's timestamp (only if it's a logout) 
     lead(case when Activity_code = 'logout' then timestamp end) 
     over (partition by User_id 
      order by timestamp) as Logout 
    from tab 
) dt 
where Logon is not null -- only the login rows 
+0

谢谢。我会尝试。 – RookieDBA

+0

请查看其他详细信息: – RookieDBA

+0

@RookieDBA:示例数据中的'activity_code'在哪里,它是'event_type'?没有时间的一部分,你的例子是无用的。不过,我的方法应该工作。 – dnoeth

0

@dnoeth:

select to_char(timestamp, 'MM/DD/YYYY'), 
userid, 
MIN(timestamp) KEEP (DENSE_RANK FIRST ORDER BY eventtype) "Login", 
MAX(timestamp) KEEP (DENSE_RANK LAST ORDER BY eventtype) "Logout" 
FROM formscan.pmevents_bkp 
where timestamp BETWEEN TO_DATE('01-mar-17','DD-MON-YY') AND TO_DATE('30-  
mar-17','DD-MON-YY') 
and (eventtype = '100' 
or eventtype = '101') 
group by to_char(timestamp, 'MM/DD/YYYY'),userid; 
+0

这应该是你的问题的一部分,而不是一个答案。这是您现有的查询,这与我的答案完全不同。只需更改CASE逻辑以匹配'activity_code',100 =登录和101 =注销? – dnoeth