2011-03-09 63 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