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