У меня есть таблица с именем Info этой схемы:
int objectId;
int time;
int x, y;
В системе много избыточных данных, то есть objectId
не УНИКАЛЬНО. Для каждого objectId
может быть несколько записей time, x, y
.
Я хочу получить список последней позиции каждого объекта. Я начал с этого запроса:
SELECT * FROM Info GROUP BY objectId
Это дало мне именно тот список, который я искал. Однако я также хочу получить только самые последние времена для каждого объекта, поэтому я попытался:
SELECT * FROM Info GROUP BY objectId ORDER BY time DESC
Это дало мне 1010 * спущенный список информации. Тем не менее, Я не думаю, что он сделал то, что я хочу - это вернуть мне самое последнее 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
.