【问题标题】:Return max(field) for group of records - no, not just max()返回一组记录的 max(field) - 不,不仅仅是 max()
【发布时间】:2014-11-01 15:17:29
【问题描述】:

我有一个记录字段数据收集的表,将组中的每个数据 sn-p 作为单独的行(例如,一个项目的长度和宽度都是表中的一行)。

我想显示按最近日志条目的时间戳排序的日志结果,按项目分组。

我在子选择、连接等中尝试了各种风格的 max(timestamp),但没有任何乐趣。

基本上,像这样(简化以便更容易输入):

 item  |  timestamp  |  data
  G    |    1000     | yellow
  D    |    1001     |  blue
  C    |    1002     |   red
  G    |    1003     |  green
  D    |    1004     |  pickle
  Z    |    1005     | trotsky

我希望我的结果集排序为:

  G    |    1000     | yellow
  G    |    1003     |  green
  D    |    1001     |   blue
  D    |    1004     |  pickle
  C    |    1002     |   red
  Z    |    1005     |  trotsky

这意味着按项目分组,按时间戳排序,但这当然不起作用,因为我需要所有行,这会将项目 A 放在列表的顶部,而不是最近记录的项目。

显然我错过了解决方案的真正意义。 GROUP BY 不起作用,因为我仍然需要返回所有行,因此某种 JOIN 似乎是有意义的,我只需要 oracle 来学习如何构建它。

【问题讨论】:

标签: mysql sql select group-by


【解决方案1】:

您似乎希望按每个项目的时间戳的最小值对项目进行排序。试试这个:

select l.*
from logs l join
     (select item, min(timestamp) as mints
      from logs
      group by item
     ) i
     on l.item = i.item
order by i.mints, l.item, l.timestamp;

请注意:您的数据显示“按分钟排序”。你的文字说“按最大值排序”。显然,如果你想要最大值,只是对这个查询进行简单的修改。

【讨论】:

  • 完美!感谢 SO 的专家!
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 2011-03-16
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2019-04-10
  • 2023-02-23
相关资源
最近更新 更多