sql—在mysql中,如果行重复,是否可以使用绕过行的查询来获取最后一行?

myzjeezk  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(288)

在mysql查询中,如果子句没有完成,是否可以使用绕过1行的条件。下面是vicidial系统的一个可能场景:

+--------------+---------------------+-----------------+----------------+
| username     | event_date          | event           |event_epoch_time|
+--------------+---------------------+-----------------+----------------+
|         admin| 2020-12-29 14:59:08 | login           |1609253948      |
|         admin| 2020-12-29 15:00:06 | logout          |1609254006      |
|         admin| 2020-12-29 15:14:51 | login           |1609254891      |
|         admin| 2020-12-29 15:15:00 | login           |1609254900      |
|         admin| 2020-12-29 15:59:01 | logout          |1609257541      |
+--------------+---------------------+-----------------+----------------+

在表中,我为同一个用户登录了2次,当用户关闭浏览器而不注销时,问题可能会发生。有没有可能计算出 SUM (event_epoch_time) 其中这是每2个事件的注销登录的总和?
因此,总时间将是前2行和后2行,忽略下一行

|         admin| 2020-12-29 15:14:51 | login           |1609254891      |
yks3o0rb

yks3o0rb1#

我知道你想忽略连续登录,只考虑最后一个。
可以使用窗口函数。这里有两种方法 lag() ,在mysql 8.0中提供。
如果注销之前总是有一个登录名,您可以执行以下操作:

select username, 
    count(*) as cnt_sessions,
    sum(event_epoch_time - lag_event_epoch_time) as sum_session_duration
from (
    select t.*,
        lag(event_epoch_time) over(partition by username order by event_epoch_time) as lag_event_epoch_time
    from mytable t
) t
where event = 'logout'
group by username

我们还可以调整查询,使其忽略连续的注销:

select username, sum(event_epoch_time - lag_event_epoch_time) as diff
from (
    select t.*,
        lag(event_epoch_time) over(partition by username order by event_epoch_time) as lag_event_epoch_time,
        lag(event) over(partition by username order by event_epoch_time) as lag_event
    from mytable t
) t
where event = 'logout' and lag_event = 'login'
group by username

相关问题