2015-07-10 78 views
0

我有一個審計表,它在多行中存儲主表的「狀態」值,每行都有一個日期/時間戳。讓我們調用主表「項目」,它通過不同的狀態更改:打開,待定,關閉。但是有時項目在關閉後可以重新開放。數據是這樣的:從多行查找日期/時間間隔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需要看看周圍行(如果有的話)

+0

「周圍的行」是什麼意思? – FutbolFan

+0

什麼版本的sql server? – APH

+0

2008 R2,周圍排意,07-01至07-03是開放的,而且07-06向前也是開放的。我想一個更簡單的解釋是,我需要能夠告訴我的項目是否在'x'日期的狀態'x'。這是來自瘋狂的功能請求,以告知用戶在過去的任何給定日期中項目狀態是什麼。 – n4esa

回答

2

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 
+1

這也是我的做法。但我想補充一點(就像一個提示),這種構造應該知道狀態改變的時間。大多數情況下,這會在稍後發生變更請求,並且會造成大量重新工作! – Shnugo

+0

所以真的!謝謝 ;) – Malk

0

或更高版本,可以如下用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