在构造MySQL语句时,我需要帮助,在该语句中,我需要在同一个表中找到前面的行。
我的数据如下:
history_id (自动增量),object_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这些数据的一些属性:
对于每一行,我都需要使用相同的object_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_id值,但当我使用极限1时,它不起作用,因为这样我就只会得到一个值。
你知道如何解决这个问题吗?或者你可能有更好更有效的技术?
性能在这里是有一点的,因为我有310万行在增长。
谢谢!
发布于 2018-08-07 08:09:41
最好的方向是使用window函数。简单的lag(timestamp)将使用适当的order子句来完成这项工作。见此处:lag
但如果你只需要
若要剪切子查询,只为每一行获取最高值的history_id,但当我使用限制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通常,您不应该选择比GROUP BY子句中的列更多的列,除非它们被聚合函数括起来。
https://stackoverflow.com/questions/51721621
复制相似问题