【发布时间】:2008-10-25 18:06:03
【问题描述】:
我有一个名为 Info 这个架构的表:
int objectId;
int time;
int x, y;
系统中有很多冗余数据——即objectId不是UNIQUE。对于每个objectId,可以有多个time, x, y 条目。
我想检索每个对象的最新位置列表。我从这个查询开始:
SELECT * FROM Info GROUP BY objectId
这让我得到了我正在寻找的那种列表。但是我也想获得每个对象的最新时间,所以我尝试了:
SELECT * FROM Info GROUP BY objectId ORDER BY time DESC
这给了我一个time 降序信息列表。但是,我认为它没有达到我想要的效果 - 即返回每个对象的最新 time, x, y。
谁能想象一个查询来做我想做的事?
更新我已经尝试了前三种解决方案,看看它们在大约 50,000 个信息的数据集上的表现如何。结果如下:
-- NO INDEX: forever
-- INDEX: 7.67 s
SELECT a.*
FROM Info AS a
LEFT OUTER JOIN Info AS b ON (a.objectId = b.objectId AND a.time < b.time)
WHERE b.objectId IS NULL;
-- NO INDEX: 8.05 s
-- INDEX: 0.17 s
select a.objectId, a.time, a.x, a.y
from Info a,
(select objectId, max(time) time from Info group by objectId) b
where a.objectId = b.objectId and a.time = b.time;
-- NO INDEX: 8.30 s
-- INDEX: 0.18 s
SELECT A.time, A.objectId, B.x, B.y
FROM
(
SELECT max(time) as time, objectId
FROM Info
GROUP by objectId
) as A
INNER JOIN Info B
ON A.objectId = b.objectId AND A.time = b.time;
在一定程度上,where 的表现似乎优于 inner join。
【问题讨论】: