Создать запрос 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
)

Дата Статус пользователя Примечания

Другие вопросы по тегам