【发布时间】:2011-09-06 06:33:18
【问题描述】:
我正面临一个相当有趣的问题。我有一个具有以下结构的表:
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 之类的函数将返回(子)记录集中给定列的最大值。不需要拉最后一条记录!
关于如何在每个应用程序的基础上仅选择最后一条记录的任何想法?
【问题讨论】:
-
使用窗口函数(在 Oracle 中,类似于 row_number() over (partition by...)),AFAIK SQL server 具有类似的功能。
标签: sql-server-2008 tsql sql-server-2005 greatest-n-per-group