获取最后一组不同的记录

Obi*_*ill 45 mysql distinct

我有一个包含以下列的数据库表:

id   code   value   datetime   timestamp
Run Code Online (Sandbox Code Playgroud)

在此表中,唯一的唯一值位于id即主键中.

我想根据日期时间值检索此表中最后一组不同的记录.例如,让我们说下面是我的表

id   code   value   datetime               timestamp
1    1023   23.56   2011-04-05 14:54:52    1234223421
2    1024   23.56   2011-04-05 14:55:52    1234223423
3    1025   23.56   2011-04-05 14:56:52    1234223424
4    1023   23.56   2011-04-05 14:57:52    1234223425
5    1025   23.56   2011-04-05 14:58:52    1234223426
6    1025   23.56   2011-04-05 14:59:52    1234223427
7    1024   23.56   2011-04-05 15:00:12    1234223428
8    1026   23.56   2011-04-05 15:01:14    1234223429
9    1025   23.56   2011-04-05 15:02:22    1234223430
Run Code Online (Sandbox Code Playgroud)

我想检索ID为4,7,8和9的记录,即具有不同代码的最后一组记录(基于日期时间值).我所强调的只是我想要实现的一个例子,因为这个表最终将包含数百万条记录和数百个单独的代码值.

我可以用什么SQL语句来实现这个目的?我似乎无法使用单个SQL语句完成它.我的数据库是MySQL 5.

smd*_*ger 72

这应该适合你.

 SELECT * 
 FROM [tableName] 
 WHERE id IN (SELECT MAX(id) FROM [tableName] GROUP BY code)
Run Code Online (Sandbox Code Playgroud)

如果id是AUTO_INCREMENT,则无需担心计算成本更高的日期时间,因为最近的日期时间也将具有最高的ID.

更新:从性能角度来看,确保在处理大量记录时对idcode列编制索引.如果id是主键,则内置,但您可能需要添加非聚集索引覆盖codeid.

  • +1用于避免自动增量的日期时间测试...我冒昧地重新格式化了答案。 (3认同)

Cha*_*ndu 9

试试这个:

SELECT * 
  FROM <YOUR_TABLE>
 WHERE (code, datetime, timestamp) IN
 (
   SELECT code, MAX(datetime), MAX(timestamp)
     FROM <YOUR_TABLE>
    GROUP BY code
 )
Run Code Online (Sandbox Code Playgroud)


小智 6

这是旧帖子,但是用大表测试@smdrager 答案非常慢。我对此的解决方法是使用“内部连接”而不是“在何处”。

SELECT * 
 FROM [tableName] as t1
 INNER JOIN (SELECT MAX(id) as id FROM [tableName] GROUP BY code) as t2
 ON t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)

这工作得非常快。