Создать запрос SQL для получения самых последних записей
Я создаю модуль доски статуса для моей проектной команды. Панель состояния позволяет пользователю устанавливать свой статус как в или из, и они также могут предоставить заметку. Я планировал хранить всю информацию в одной таблице... и пример данных приведен ниже:
Date User Status Notes
-------------------------------------------------------
1/8/2009 12:00pm B.Sisko In Out to lunch
1/8/2009 8:00am B.Sisko In
1/7/2009 5:00pm B.Sisko In
1/7/2009 8:00am B.Sisko In
1/7/2009 8:00am K.Janeway In
1/5/2009 8:00am K.Janeway In
1/1/2009 8:00am J.Picard Out Vacation
Я хотел бы запросить данные и вернуть самый последний статус для каждого пользователя, в этом случае мой запрос будет возвращать следующие результаты:
Date User Status Notes
-------------------------------------------------------
1/8/2009 12:00pm B.Sisko In Out to lunch
1/7/2009 8:00am K.Janeway In
1/1/2009 8:00am J.Picard Out Vacation
Я пытаюсь выяснить, TRANSACT-SQL, чтобы это произошло? Любая помощь будет оценена.
5 ответов
Объединитесь в производную таблицу подзапроса и затем присоединитесь к ней.
Select Date, User, Status, Notes
from [SOMETABLE]
inner join
(
Select max(Date) as LatestDate, [User]
from [SOMETABLE]
Group by User
) SubMax
on [SOMETABLE].Date = SubMax.LatestDate
and [SOMETABLE].User = SubMax.User
Иначе, это будет сканировать таблицу только один раз вместо двух, если вы используете подзапрос
только SQL Server 2005 и выше
select Date, User, Status, Notes
from (
select m.*, row_number() over (partition by user order by Date desc) as rn
from [SOMETABLE] m
) m2
where m2.rn = 1;
Производная таблица будет работать, но если это SQL 2005, CTE и ROW_NUMBER могут быть чище:
WITH UserStatus (User, Date, Status, Notes, Ord)
as
(
SELECT Date, User, Status, Notes,
ROW_NUMBER() OVER (PARTITION BY User ORDER BY Date DESC)
FROM [SOMETABLE]
)
SELECT User, Date, Status, Notes from UserStatus where Ord = 1
Это также облегчило бы отображение самых последних статусов х от каждого пользователя.
Еще один простой способ:
SELECT Date, User, Status, Notes
FROM Test_Most_Recent
WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)
Добавьте автоматически увеличивающийся первичный ключ к каждой записи, например, UserStatusId.
Тогда ваш запрос может выглядеть так:
select * from UserStatus where UserStatusId in
(
select max(UserStatusId) from UserStatus group by User
)
Дата Статус пользователя Примечания