mysql-get具有相同标识符的前一行

9wbgstp7  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(402)

我需要帮助来构造一个mysql语句,在这里我需要在同一个表中找到前面的行。
我的数据如下:
历史\u id(自动递增)、对象\u id(存在多次)、时间戳。。。
例子:

1, 2593, 2018-08-07 09:37:21
2, 2593, 2018-08-07 09:52:54
3,   15, 2018-08-07 10:41:15
4, 2593, 2018-08-07 09:57:36

此数据的某些属性:
自动增量越高,相同对象id的时间戳越晚
一个对象id可能只有一行
对象id和时间戳的组合总是唯一的,不可能重复
对于每一行,我需要找到具有相同对象id的最前面一行。
我发现这个帖子:https://dba.stackexchange.com/questions/24014/how-do-i-get-the-current-and-next-greater-value-in-one-select 并通过例子,但我不能解决我的问题。
我只是测试了一下,得出了这个结论:

SELECT
    i1.history_id,
    i1.object_id,
    i1.timestamp AS state_time,
    i2.timestamp AS previous_time
FROM
    history AS i1
    LEFT JOIN (
        select  timestamp as timestamp,history_id as history_id,object_id as object_id
        from        history
        group by object_id
        ) AS i2 on i2.object_id = i1.object_id and i2.history_id < i1.history_id

现在我只需要剪切子查询,即我只获得每行的history\u id的最高值,但当我使用limit 1时它不起作用,因为这样我将只得到一个值。
你知道怎么解决这个问题吗?或者你有更好更有效的技术?
性能是这里的一个重点,因为我有310万行越来越高。。
谢谢您!

57hvy0tb

57hvy0tb1#

最好的方向是使用 window 功能。简单 lag(timestamp) 我会按条款的顺序做这项工作。请看这里:https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lag
但如果你只需要
为了剪切子查询,我只获取每行的history\u id的最高值,但当我使用limit 1时,它不起作用
然后将子查询从

select  timestamp as timestamp,history_id as history_id,object_id as object_id
        from        history
        group by object_id

select  object_id as object_id, MAX(history_id) as history_id, MAX(timestamp) as timestamp
        from        history
        group by object_id

一般来说,您不应该选择比GROUPBY子句中更多的列,除非它们用聚合函数括起来。

相关问题