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