У меня есть таблица, которая является набором записи относительно того, когда пользователь был зарегистрирован.
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
Как я создаю запрос, который дал бы мне последнюю дату каждого пользователя?
Обновление: Я забыл, что у меня должно было быть значение, которое соглашается с последней датой.
select t.username, t.date, t.value
from MyTable t
inner join (
select username, max(date) as MaxDate
from MyTable
group by username
) tm on t.username = tm.username and t.date = tm.MaxDate
SELECT Username, date, value
from MyTable mt
inner join (select username, max(date) date
from MyTable
group by username) sub
on sub.username = mt.username
and sub.date = mt.date
Решили бы обновленную проблему. Это может не работать так хорошо с большими таблицами, даже при хорошей индексации.
Чтобы получить всю строку, содержащую максимальную дату для пользователя:
select username, date, value
from tablename where (username, date) in (
select username, max(date) as date
from tablename
group by username
)
Этот вопрос должен дать вам правильный результат для вашего отредактированного вопроса.
Подзапрос гарантирует, что найдены только строки с самой последней датой, а внешний GROUP BY
позаботится о связях. Когда есть две записи для одной и той же даты для одного и того же пользователя, он вернет ту, у которой наивысшее значение
.
SELECT t.username, t.date, MAX( t.value ) value
FROM your_table t
JOIN (
SELECT username, MAX( date ) date
FROM your_table
GROUP BY username
) x ON ( x.username = t.username AND x.date = t.date )
GROUP BY t.username, t.date
Вы бы использовали агрегатную функцию MAX и GROUP BY
SELECT username, MAX(date), value FROM tablename GROUP BY username, value
Использование оконных функций (работает в Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
select * from (
select
username,
date,
value,
row_number() over(partition by username order by date desc) as rn
from
yourtable
) t
where t.rn = 1