2016-11-14 153 views
0

我正在尝试解决我遇到的问题。计数日SQL Server

| ID | Op | Object | STATE | Timestamp | 
    | 01 | 1 | A  | 1 | 01-02-2016| 
    | 02 | 1 | A  | 2 | 04-02-2016| 
    | 03 | 1 | A  | 1 | 10-02-2016| 
    | 04 | 1 | A  | 3 | 01-02-2016| 
    | 05 | 2 | A  | 2 | 02-02-2016| 
    | 06 | 3 | A  | 1 | 05-02-2016| 
    | 07 | 3 | A  | 2 | 10-11-2016| 

我需要编写返回计数的天,一个对象过去在状态2 实施例中,对象A,从04-02到留在10-02 STATE 2 + 02-02一个SQL到05-02和从10-11到今天这么6天+3天+4天。

SQL return 13 

目前通过代码,但我需要它在SQL提取,我不知道如何继续。这是可能的SQL?

谢谢

+0

我不明白这张桌子。在01-02-2016对象A切换到状态1(记录01)和状态3(记录04)?从2016年2月2日到2016年2月3日,它的状态为1(记录01)和状态2(记录05)。 2016年4月2日,它有两次状态2(来自记录05和02),05-02-2016有状态2(来自记录02)和状态1(来自记录06)。所以一个对象有多个状态,你只能通过ID排序和查找重叠的日期范围来确定哪个状态和多少个状态? –

回答

1

我想你想lead()采用聚集和日期逻辑一起:

select object, 
     sum(case when state = 2 then datediff(day, timestamp, coalesce(next_timestamp, getdate())) 
       else 0 
      end) as days_state_2 
from (select t.*, 
      lead(timestamp) over (partition by object order by timestamp) as next_timestamp 
     from t 
    ) t 
group by object; 

或者,您可以将过滤条件外select

select object, 
     sum(datediff(day, timestamp, coalesce(next_timestamp, getdate()))) as days_state_2 
from (select t.*, 
      lead(timestamp) over (partition by object order by timestamp) as next_timestamp 
     from t 
    ) t 
where state = 2 
group by object; 
+1

谢谢,不知道铅(),它工作正常。 – BerithBE

1
select object, 
     sum(datediff(day, timestamp, coalesce(next_timestamp, getdate()))) as days_state_2 
from (select *, 
      lead(timestamp) over (partition by object order by timestamp) as next_timestamp 
     from #b 
    ) t 
where state = 2 
group by object; 
+0

谢谢,不知道铅(),它工作正常。 – BerithBE