【问题标题】:SQL how to select the most recent timestamp by values?SQL如何按值选择最近的时间戳?
【发布时间】:2014-12-20 14:09:45
【问题描述】:

假设我有一张这样的桌子

CREATE TABLE events (
  id INT,
  sensor INT,
  event_type INT,
  time datetime
  );

INSERT INTO events VALUES (0,2,4,'2012-06-08 12:13:14');
INSERT INTO events VALUES (1,3,4,'2012-06-08 13:13:14');
INSERT INTO events VALUES (2,2,4,'2012-06-08 12:15:14');
INSERT INTO events VALUES (3,1,6,'2012-06-08 15:13:14');

检索传感器添加的最新事件的“最佳”方法是什么?所以结果会是这样的(注意显示的是 id 2 而不是 id 0,因为 id 2 是最新的:

ID   sensor
3      1
1      3
2      2

我写了一个这样的选择,但是还有其他方法吗?或者更简单的方法来归档它?

SELECT id,time,sensor,event_type 
FROM events s1
WHERE time = (
  SELECT MAX(time) FROM events s2 WHERE s1.sensor = s2.sensor
)
ORDER BY time DESC

谢谢!

【问题讨论】:

  • 如果你在最后使用 LIMIT 子句,而没有 WHERE 子句怎么办?也许我理解你的问题是错误的。
  • 有不同的写法,但不一定更简单

标签: mysql sql group-by timestamp


【解决方案1】:

这个变种使用GROUP BY,需要用你的数据运行并查看性能

SELECT events.id, events.sensor 
FROM events
JOIN
(
    SELECT sensor, max(time) as maxTime
    FROM events
    group by sensor
) T
on events.sensor = T.sensor
and events.time = T.maxTime
ORDER BY events.time DESC

【讨论】:

  • 我更喜欢join方法而不是依赖子查询+1
【解决方案2】:
select * from events 
     where time in(SELECT max(time) FROM events 
            group by sensor_id,event_type) 
     Order by time desc;

【讨论】:

    【解决方案3】:

    这无需使用聚合函数即可:

    select e1.* from events e1 
      left outer join events e2 on e1.sensor = e2.sensor 
        and e1.id != e2.id 
        and e1.time < e2.time 
      where e2.time is null;
    

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2015-03-14
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多