2012-05-27 147 views
0

我已經在我上一個問題的帖子上詢問過此問題 Printing the current value and previous value between the date range 但是這次我想對此處的日期範圍做更具體的說明。如果不在日期範圍內打印日期範圍和最後一條記錄之間的記錄

正如你看到的我有下面的數據集:

ID  DATE   TIME  STATUS 
    --------------------------------------------- 
    A  01-01-2000  0900  ACTIVE 
    A  05-02-2000  1000  INACTIVE 
    A  01-07-2000  1300  ACTIVE 
    B  01-05-2005  1000  ACTIVE 
    B  01-08-2007  1050  ACTIVE 
    C  01-01-2010  0900  ACTIVE 
    C  01-05-2010  0800  INACTIVE 
    C  01-07-2010  1900  ACTIVE 

我想這與以下日期範圍內的所有ID(01-04-2010至01-06-2010)。輸出應該是:

ID  DATE   TIME  STATUS 
--------------------------------------------- 
A  01-07-2000  1300  ACTIVE 
B  01-08-2007  1050  ACTIVE 
C  01-01-2010  0900  ACTIVE 
C  01-05-2010  0800  INACTIVE 

的想法是,如果你看到每一個ID不管的最後一條記錄,如果它,因爲我想要的狀態顯示不屬於該日期範圍,自該特定日期的ID =狀態沒有改變。另外,如果您看到ID = C,那麼日期都屬於日期範圍,因此應同時打印。

PS:日期是在日期格式和MS SQL

我將不勝感激,如果任何人可以給自己在這個服食。謝謝你的時間。

回答

0

嘗試使用SET DATEFORMAT ymd及以下查詢:

DATEFORMAT ymd 

SELECT customerName 
FROM dbo.customer 
WHERE insertedDate BETWEEN '2010-04-01 'AND '2010-06-01' 
+0

這將打印指定的日期之間的日期範圍...但我希望每個ID的最後一個記錄。請參閱問題 – Afaq

+0

歡迎StackOverflow的:如果您可以發佈代碼,XML或數據樣本,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」)以精確地格式化和語法突出顯示它! –

0

如果我理解正確的話,你想:

  1. 任何ID,其在指定範圍內的地位,並
  2. 最近活動的狀態不在

在這裏,我打電話給您的來源表STATS

DECLARE @START DATE = '1/4/2010'; 
DECLARE @END DATE = '1/6/2010'; 

; WITH a AS (
    SELECT *,r=ROW_NUMBER()OVER(PARTITION BY [ID],[STATUS] ORDER BY [DATE] DESC, [TIME] DESC) 
    FROM [STATS] 
) 
SELECT [ID], [DATE], [TIME], [STATUS] FROM a 
WHERE [DATE] BETWEEN @START AND @END 

UNION 

SELECT [ID], [DATE], [TIME], [STATUS] FROM a 
WHERE [STATUS]='ACTIVE' 
AND r=1; 

結果:

ID DATE  TIME STATUS 
---- ---------- ---- ---------------- 
A 2000-01-07 1300 ACTIVE 
B 2007-01-08 1050 ACTIVE 
C 2010-01-05 0800 INACTIVE 
C 2010-01-07 1900 ACTIVE 
相關問題