从多行查找日期/时间间隔T-SQL
问题描述:
我有一个审计表,它在多行中存储主表的“状态”值,每行都有一个日期/时间戳。让我们调用主表“项目”,它通过不同的状态更改:打开,待定,关闭。但是有时项目在关闭后可以重新开放。数据是这样的:从多行查找日期/时间间隔T-SQL
ProjectId Date Status
1234 07-01-2015 Open
1234 07-03-2015 Pending
1234 07-05-2015 Closed
1234 07-06-2015 Open
我需要一个日期参数值,并确定状态的项目“1234”是对给定的日期。
ex: Date=07-02-2015 would give me "Open" Date=07-07-2015 would also give me "Open" Date=07-03-2015 would give me "Pending"
我遇到的问题是,SQL需要看看周围行(如果有的话)
答
1)窗口内日期限制的行唯一的行。 2)按日期倒序排列的结果(把最近在顶部) 3)如果你有2012选择第一行
DECLARE @CheckDate DATETIME = '07-07-2015',
@ProjectId INT = 1234
-- To ignore time, set the check date to the first millisecond of the
-- next day and use a less than operator
SET @CheckDate = DATEADD(dd, DATEDIFF(dd, 0, @CheckDate) + 1, 0)
SELECT TOP 1
[Status]
FROM [Project]
WHERE [ProjectId] = @ProjectId
AND [Date] < @CheckDate
ORDER BY [Date] DESC
答
或更高版本,可以如下用Lead
做到这一点:
declare @date datetime = '7-2-15' --or whatever
select ProjectID, Status from (
select *
, lead(date) over (partition by projectID order by date) as NextEvent
from MyTable) a
where @date between [date] and isnull(NextEvent, @date + 1)
否则,您可以使用row_number
和自联接来近似lead
。
请注意,根据日期的精确程度,您可能需要使用类似where @date >= date and @date < isnull(NextEvent, @date + 1)
而不是between
。
“周围的行”是什么意思? – FutbolFan
什么版本的sql server? – APH
2008 R2,周围排意,07-01至07-03是开放的,而且07-06向前也是开放的。我想一个更简单的解释是,我需要能够告诉我的项目是否在'x'日期的状态'x'。这是来自疯狂的功能请求,以告知用户在过去的任何给定日期中项目状态是什么。 – n4esa