我能在mysql中找到相邻的行吗?

vltsax25  于 2023-02-28  发布在  Mysql
关注(0)|答案(2)|浏览(123)

我有一个记录用户事件的日志表。这些事件按时间戳排序。
| 身份证|事件|用户|上下文|时间创造的|
| - ------|- ------|- ------|- ------|- ------|
| 五个|登录|二百三十四|无|小行星65535|
| 八个|开放|二百三十四|五个|小行星65536|
| 十三|开放|二百三十四|九|小行星65539|
| 十七|开放|二百三十四|八个|小行星65512|
| 四十三|登录|一百二十八|无|小行星65513|
| 四十四|登录|二九三|无|小行星65515|
| 六十五|开放|二九三|五个|小行星65516|
| 六十六|开放|二百三十四|五个|小行星65519|
| 九十七|登录|五六七|无|小行星65521|
| 九十九|开放|五六七|九|小行星65528|
我需要一个查询来查找相邻的前event='open'行-紧挨着同一用户ID的event='login'行(以及其他可能的筛选器
伪示例:
select * from log where event='open' and context=5 and timecreated > (select timecreated from log where event='login' and user = (the same as the previous query) limit 1).
在上表中,这将与行匹配
| 身份证|事件|用户|上下文|时间创造的|
| - ------|- ------|- ------|- ------|- ------|
| 八个|开放|二百三十四|五个|小行星65536|
| 六十五|开放|二九三|五个|小行星65516|
| 九十九|开放|五六七|九|小行星65528|
这在MySQL语句中可能吗?

f8rj6qna

f8rj6qna1#

尝试使用LAG()窗口函数执行以下操作:

SELECT *
FROM (
    SELECT *, LAG(event) OVER (PARTITION BY user ORDER BY timecreated) AS prev_event
    FROM log
) t
WHERE event = 'open'
AND prev_event = 'login'
AND context = 5

如果您使用的是MySQL〈8,您可以用途:

SELECT o.*
FROM log o
JOIN log l
    ON l.event = 'login'
    AND o.user = l.user
    AND o.timecreated > l.timecreated
WHERE o.event = 'open'
AND o.context = 5
AND NOT EXISTS (
    SELECT 1 FROM log
    WHERE user = o.user
    AND timecreated > l.timecreated
    AND timecreated < o.timecreated
);

最好使用id进行事件顺序比较,但idtimecreated值不同步。在示例中,5、8和13出现在所有其他具有更高ID的行之后。这可能是创建示例时的错误。

goqiplq2

goqiplq22#

select * from test t
where t.event = 'open' and
    t.user =
   (select user
    from test
    where id = (select max(id) from test where  id < t.id) and event = 'login');

相关问题