Я столкнулся с довольно интересной проблемой. У меня есть таблица со следующей структурой:
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 сделает работу очень легко.
Второе требование состоит в том, чтобы иметь возможность группировать события на Application. Другими словами, отображать все события таким образом, что если ApplicationId повторяется более одного раза, хватайте только последнюю запись для каждого приложения. Первичный ключ Event (Id) в этой точке больше не нужен в этом запросе/представлении.
Вы также можете заметить, что дата и время события находятся в строчном формате. Это нормально, потому что они соответствуют стандартным форматам даты: mm/dd/yyyy и 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, вернет наибольшее значение для данного столбца из (под) набора записей. Не нужно тянуть последнюю запись!
Любые идеи о том, как выбрать только последнюю запись на основе каждого приложения?