【问题标题】:Select last group of data选择最后一组数据
【发布时间】:2012-11-13 17:51:15
【问题描述】:

我有一张这样的桌子

测量

id    object_id   generated_at (v)    
110   4           2012-11-13 10:29:00   
109   4           2012-11-13 10:28:00   
108   4           2012-11-13 10:27:00
107   3           2012-11-13 10:26:00
106   3           2012-11-13 10:25:00
105   4           2012-11-13 10:24:00
104   4           2012-11-13 10:23:00
103   1           2012-11-13 10:22:00
102   1           2012-11-13 10:21:00
...

generated_at 列排序。

我的问题:有没有选择的能力

id    object_id   generated_at (v)    
110   4           2012-11-13 10:29:00   
109   4           2012-11-13 10:28:00   
108   4           2012-11-13 10:27:00

最后一组(按generated_at排序)具有相同object_id的测量?

可能是 Rails 中的测量模型示例,也可能只是 SQL 查询,感谢您的帮助!

【问题讨论】:

  • Measurement.order('generated_at ASC').group('object_id').limit(4) ?并最终使用特定 id 过滤它:Measurement.order('generated_at ASC').group('object_id').where(object_id: my_obj_id).limit(4) 请让我知道它是否是您要查找的内容以及它是否有效
  • 我不知道同一个对象会有多少行,它不是恒定的,我只是举个例子

标签: mysql sql ruby-on-rails ruby-on-rails-3


【解决方案1】:

您最初的问题显然想要最近组中的对象,而不是所有对象。为此,您需要计算最大对象 id 和其他对象的最大生成时间:

select *
from t cross join
     (select max(object_id) maxobject_id from t) maxt
where object_id = maxt.maxobject_id and
      generated_at > (select max(generated_at) from t where object_id <> maxt.maxobject_id)

【讨论】:

  • 非常感谢,这个,结合fthiella关于object_id的回答(我不是在寻找最大的,而是最新的)是我正在寻找的!
  • +1 - 就在@Gordon Linoff - 你发帖时我正在制定一个类似的解决方案。无论如何,我继续发布了我的答案..
【解决方案2】:

我相信这会奏效:SELECT * FROM table WHERE object_id = (SELECT MAX(object_id) FROM table)

【讨论】:

  • 这不是 OP 正在寻找的 - 这只会选择 object_id = 4 的所有行。
  • 感谢您的回答,但 dugas 对,我只需要顶级组,并且 object_id 是任意的
  • 它在问题被编辑之前工作。我会看看你是否可以创建一个对测量块进行分组的列。根据最新条目的 object_id 挑选东西是行不通的,因为你会得到后面的行。这些可以根据“id”的运行进行过滤以获得最后一个连续的块,但 id 并不总是连续的。
【解决方案3】:

下面的查询会得到结果:

select * from Measurements
left join Measurements as M2
on
(M2.generated_at > Measurements.generated_at and M2.object_id <> Measurements.object_id)
where 
M2.id IS NULL
and
Measurements.object_id = 
(select object_id from Measurements where generated_at = (select MAX(generated_at) from Measurements))

【讨论】:

    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多