我需要帮助来构造一个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万行越来越高。。
谢谢您!
1条答案
按热度按时间57hvy0tb1#
最好的方向是使用
window
功能。简单lag(timestamp)
我会按条款的顺序做这项工作。请看这里:https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lag但如果你只需要
为了剪切子查询,我只获取每行的history\u id的最高值,但当我使用limit 1时,它不起作用
然后将子查询从
到
一般来说,您不应该选择比GROUPBY子句中更多的列,除非它们用聚合函数括起来。