我有一个包含以下列的数据库表:
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.
更新:从性能角度来看,确保在处理大量记录时对id和code列编制索引.如果id是主键,则内置,但您可能需要添加非聚集索引覆盖code和id.
试试这个:
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)
这工作得非常快。