Как получить последнюю запись в группе в SQL

Я столкнулся с довольно интересной проблемой. У меня есть таблица со следующей структурой:

CREATE TABLE [dbo].[Event]
(
    Id int IDENTITY(1,1) NOT NULL,
    ApplicationId nvarchar(32) NOT NULL,
    Name nvarchar(128) NOT NULL,
    Description nvarchar(256) NULL,
    Date nvarchar(16) NOT NULL,
    Time nvarchar(16) NOT NULL,
    EventType nvarchar(16) NOT NULL,
    CONSTRAINT Event_PK PRIMARY KEY CLUSTERED ( Id ) WITH (
        PAD_INDEX = OFF, 
        STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS  = ON
    )
)

Проблема в том, что мне нужно отобразить эти данные в гриде. Есть два требования. Первое - отображать все события, независимо от того, какое приложение их выбрасывает. Это просто - оператор select сделает эту работу очень легко.

Второе требование - возможность группировать события по приложениям. Другими словами, отображать все события таким образом, чтобы если ApplicationId повторяется более одного раза, брать только последнюю запись для каждого приложения. Первичный ключ события (Id) на данный момент больше не нужен в этом запросе/просмотре.

Вы также можете заметить, что дата и время события представлены в строковом формате. Это нормально, поскольку они соответствуют стандартным форматам даты и времени: mm/dd/yyy и hh:mm:ss. Я могу извлечь их следующим образом:

Convert( DateTime, (Date + ' ' +  Time)) AS 'TimeStamp'

Моя проблема в том, что если я использую функции AGGREGATE для остальных столбцов, я не знаю, как они себя поведут:

SELECT
    ApplicationId,
    MAX(Name),
    MAX(Description),
    MAX( CONVERT(DateTime, (Date + ' ' + Time))) AS 'TimeStamp',
    MAX( EventType )
FROM
    Event
GROUP BY
    ApplicationId

Причина, по которой я не решаюсь это сделать, заключается в том, что такая функция, как MAX, вернет наибольшее значение для данного столбца из (под)набора записей. При этом не обязательно вытаскивать последнюю запись!

Есть идеи, как выбрать только последнюю запись для каждого приложения?

25
задан Tab Alleman 15 August 2018 в 12:58
поделиться