Я столкнулся с довольно интересной проблемой. У меня есть таблица со следующей структурой:
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
, вернет наибольшее значение для данного столбца из (под)набора записей. При этом не обязательно вытаскивать последнюю запись!
Есть идеи, как выбрать только последнюю запись для каждого приложения?