【发布时间】:2014-01-22 14:52:44
【问题描述】:
我有一个存储时间跨度数据的表。该表的架构类似于:
ID INT NOT NULL IDENTITY(1,1)
RecordID INT NOT NULL
StartDate DATE NOT NULL
EndDate DATE NULL
我正在尝试计算每个记录 ID 的开始日期和结束日期,因此最小 StartDate 和最大 EndDate。 StartDate 不可为空,因此我无需担心这一点,但我需要 MAX(EndDate) 来表示这是当前正在运行的时间跨度。
重要的是我保持 EndDate 的 NULL 值并将其视为最大值。
最简单的尝试(如下)无法突出显示 MIN 和 MAX 将忽略 NULLS 的问题(来源:http://technet.microsoft.com/en-us/library/ms179916.aspx)。
SELECT recordid, MIN(startdate), MAX(enddate) FROM tmp GROUP BY recordid
我已经创建了一个 SQL Fiddle 并完成了基本设置。
http://sqlfiddle.com/#!3/b0a75
我怎样才能让 SQL Server 2008 按照我的意愿从 SQLFiddle 中给出的数据中产生以下结果?
RecordId Start End
1 2009-06-19 NULL
2 2012-05-06 NULL
3 2013-01-25 NULL
4 2004-05-06 2009-12-01
【问题讨论】:
-
不明白 - 如果我运行
SELECT recordid, MIN(startdate), Max(enddate) FROM tmp GROUP BY recordid则保留 null! -
- 您在 OP 中显示的结果似乎与 sqlfiddle 架构无关?
-
查看sqlfiddle.com/#!3/565dc/29 以获取有效的示例数据。如果一个分组只存在一条记录,则 NULL 将被保留,否则它将被任何日期覆盖。
-
@whytheq,你说得对,它没有。这是一个示例结果。
-
我已更新问题,因此结果对示例数据有效。
标签: sql sql-server tsql