2011-03-09 76 views
3

我有一個表,其結構如下選擇實時值的時間間隔 - 缺少第一個和最後一個間隔

| ChangedDate | IDParameter | ChangedTo(位列)|

所以我需要的時間間隔時,我的參數是真還是假,像下面

| IDParameter | ChangedToDate1 | ChangedToDate2 | ChangedTo(真亦假||假爲真)

和我做

With RankedDates As 
(
    Select T1.[ChangedDate], T1.ID, T1.[ChangedToValue] 
    , Row_Number() Over(Partition By T1.ID Order By T1.[ChangedDate]) As Num 
    From [Changes] As T1 
) 

    SELECT T1.[ID] 
     ,T2.[ChangedToValue] 
     ,T1.[ChangedDate] AS startDate 
     ,T2.[ChangedDate] AS endDate 
    FROM [RankedDates] AS T1 
    Join RankedDates As T2 
        On T2.ID = T1.ID 
          And T2.Num = T1.Num + 1 
          And T2.[ChangedToValue] <> T1.[ChangedToValue] 
        Order By T2.[ChangedDate] 

麻煩的是,我第一次失蹤,最後一個時間間隔在這裏。對於開始日期,如果是第一個,則它必須爲NULL,對於每個參數ID,它的最後時間間隔的endDate必須爲NULL。我想我需要添加它與聯盟,但我的麻煩,我不明白如何爲每個IDParameter添加它。

我不知道什麼時候第一次更改了值,我不知道值是否會在任何時候改變,所以我需要NULL或一些mindate的第一個時間間隔和NULL或最後一個時間間隔的一些maxdate。

ms sql server 2008

對於這樣複雜的問題感到抱歉。

實施例:

08.03.2011 ID1 0 -> 1 
09.03.2011 ID1 1 -> 0 
09.03.2011 ID2 0 -> 1 
10.03.2011 ID1 0 -> 1 
10.03.2011 ID2 1 -> 0 

--->

NULL , 08.03.2011 ID1 is 0 
NULL , 09.03.2011 ID2 is 0 
08.03.2011, 09.03.2011 ID1 is 1 
09.03.2011, 10.03.2011 ID2 is 1 
09.03.2011, 10.03.2011 ID1 is 0 
10.03.2011, NULL ID1 is 1 
10.03.2011, NULL ID2 is 0 
+2

我喜歡你說的複雜的編程問題遺憾的事實...複雜性是最愛極客的東西:) – Simeon 2011-03-09 08:29:21

+0

複雜的問題也是我們需要和擁有這樣的網站的主要原因,即使人們現在也帶着基本的知識問題來到這裏。 – 2011-03-09 10:39:07

回答

3

如何有關使用FULL JOIN代替JOIN

它解決了你的問題嗎?

編輯:

我認爲這應該工作,只要你想。

select isnull(T1.ID, T2.ID) as ID 
     ,isnull(T2.[ChangedToValue], case when T1.[ChangedToValue] = 1 then 0 else 1 end) as [ChangedToValue] 
     ,T1.[ChangedDate] as startdate 
     ,T2.[ChangedDate] as enddate 
from [RankedDates] T1 
full join [RankedDates] T2 
    on T2.num = T1.num +1 
    and T2.ID = T1.ID 
    and T1.[ChangedToValue] <> T2.[ChangedToValue] 

order by 
    case when T2.[ChangedDate] is null then 1 else 0 end 
    ,T2.[ChangedDate] 

哪裏說得對ChangedToValue,我修改了它現在表現出相反的,如果T2爲null。

+0

不......我想我需要模擬他們我不知道什麼時候價值第一次改變,我不知道值是否會隨時改變,所以我需要NULL或一些mindate的第一個時間間隔和NULL或者最後一次間隔的最大值。 – Cynede 2011-03-09 09:20:22

+0

那好吧,你能提供一些樣本數據嗎? – Johan 2011-03-09 09:57:34

+0

是,添加示例 – Cynede 2011-03-09 09:59:41

2

假設這就是你的基地臺的外觀:
CHANGEDATE IDParameter ChangedTo
2011-03-08 ID1真
2011-03-09 ID1假
2011-03-09 ID2真
2011-03- 10 ID1真
2011-03-10 ID2假

SELECT (SELECT TOP 1 t0.[ChangeDate] FROM [calendardb].[dbo].[Table_1] t0 
WHERE t0.IDParameter = t1.IDParameter AND t0.ChangeDate < t1.ChangeDate ORDER 
BY t0.ChangeDate DESC), 
    [ChangeDate] 
    ,[IDParameter] 
    ,[ChangedTo] 
FROM [calendardb].[dbo].[Table_1] t1 
UNION 
SELECT MAX(ChangeDate) as maxd ,NULL,[IDParameter], 
(SELECT ChangedTo FROM [calendardb].[dbo].[Table_1] t0 WHERE t0.ChangeDate = (SELECT MAX(ChangeDate) FROM [calendardb].[dbo].[Table_1] 
GROUP BY [IDParameter] HAVING IDParameter = t1.IDParameter) AND t1.IDParameter = t0.IDParameter) 

FROM [calendardb].[dbo].[Table_1] t1 
GROUP BY [IDParameter] 

會給你造成這樣的:

NULL 2011-03-08 ID1 1
2011-03-08 2011-03-09 ID1 0
NULL 2011-03-09 ID2 1
2011-03-09 2011-03-10 ID1 1
2011-03-09 2011-03-10 0 ID2
2011-03-10 NULL ID1 1
2011-03-10 NULL ID2 0

+0

好的,增加了一個例子。 – Cynede 2011-03-09 09:57:59

+0

無法理解你的查詢是如何工作的...爲什麼要用「select top 1」命令,以及「NULL」來自哪裏? – Cynede 2011-03-09 10:35:53

+1

我只想選擇當前的最後一條記錄,這就是爲什麼在當前(其中date Silx 2011-03-09 10:42:47