首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -获取具有相同标识符的前一行

MySQL -获取具有相同标识符的前一行
EN

Stack Overflow用户
提问于 2018-08-07 07:53:49
回答 1查看 543关注 0票数 0

在构造MySQL语句时,我需要帮助,在该语句中,我需要在同一个表中找到前面的行。

我的数据如下:

history_id (自动增量),object_id (存在多次),时间戳,.

示例:

代码语言:javascript
复制
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的时间就越晚。
  • 一个object_id可能只有一行。
  • object_id和时间戳的组合总是唯一的,不可能重复。

对于每一行,我都需要使用相同的object_id查找最前面的行。

我找到了这篇文章:https://dba.stackexchange.com/questions/24014/how-do-i-get-the-current-and-next-greater-value-in-one-select,并研究了这些例子,但我无法解决我的问题。

我只是测试了一下,然后得出了这样的结论:

代码语言:javascript
复制
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万行在增长。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-08-07 08:09:41

最好的方向是使用window函数。简单的lag(timestamp)将使用适当的order子句来完成这项工作。见此处:lag

但如果你只需要

若要剪切子查询,只为每一行获取最高值的history_id,但当我使用限制1时,它不能工作。

然后将子查询从

代码语言:javascript
复制
select  timestamp as timestamp,history_id as history_id,object_id as object_id
        from        history
        group by object_id

代码语言:javascript
复制
select  object_id as object_id, MAX(history_id) as history_id, MAX(timestamp) as timestamp
        from        history
        group by object_id

通常,您不应该选择比GROUP BY子句中的列更多的列,除非它们被聚合函数括起来。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51721621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档