前一行取决于当前行的值

时间:2012-01-09 03:52:20

标签: mysql

以下查询显示基于userId的登录信息。如果用户在未注销或会话过期的情况下关闭浏览器,则logoff_date将保持为null,如下例所示。

userId    logon_date              logoff_date
1         2012-01-01 10:00:00     2012-01-01 12:00:00
1         2012-01-01 09:00:00     NULL

因为2012-01-01 10:00:00有较新 logon_date,我知道用户必须已经杀死了2012-01-01 09:00的login_date会话:00

这是我的问题:

SELECT userId, logon_date, logoff_date
FROM user_logon
WHERE user_id = 2

我想要的只是计算活动会话。为了做到这一点,如果有一个具有相同userId的较新行,我需要跳过缺少logoff_date的行。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

    SELECT l.*
      FROM user_logon l
INNER JOIN (SELECT MAX(logon_date) mdate,
                   user_id
              FROM user_logon
          GROUP BY user_id) x ON x.user_id = l.user_id
                             AND l.logon_date = x.mdate
     WHERE l.logoff_date IS NULL

PS:此查询暗示对于每个日期,只有一个特定用户的记录