我正面臨一個相當有趣的問題。我有一個表結構如下:如何在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
)
)
所以問題是,我必須在網格中顯示此數據。有兩個要求。第一個是顯示所有事件,而不管應用程序拋出它們。這很簡單 - 選擇語句將很容易地完成這項工作。
第二個要求是能夠按Application
對事件進行分組。換句話說,以一種方式顯示所有事件,如果ApplicationId
重複多次,則只抓取每個應用程序的最後一個條目。這個事件(Id)的主鍵在這個查詢/視圖中不再需要。
您可能還注意到事件日期和時間是字符串格式。這是可以的,因爲它們遵循標準的日期時間格式:mm/dd/yyyy和hh:mm:ss。我可以拉這些如下:
Convert(DateTime, (Date + ' ' + Time)) AS 'TimeStamp'
我的問題是,如果我使用的列的其餘聚合函數,我不知道他們會怎麼表現:
SELECT
ApplicationId,
MAX(Name),
MAX(Description),
MAX(CONVERT(DateTime, (Date + ' ' + Time))) AS 'TimeStamp',
MAX(EventType)
FROM
Event
GROUP BY
ApplicationId
我的原因猶豫是因爲MAX
這樣的函數會從(子)記錄集中返回給定列的最大值。它不需要拉最後的記錄!
關於如何在每個應用程序的基礎上只選擇最後一條記錄的想法?
使用窗口函數(在Oracle中,所以像row_number()over(partition by ...),AFAIK SQL服務器具有類似的功能。 – 2011-06-01 12:42:59