2014-04-07 41 views
1

我有如下表:SQL Server 2012的分配基於零發生的ID值

ID Stop 
--------- 
1 NULL 
2 100 
3 NULL 
4 50 
5 100 
6 210 
7 300 
8 NULL 
9 NULL 
10 20 
11 70 

我所要做的是創建一個分配基礎上的位置,一個ID的新列NULL值。基本上,停止列是停止花費的時間量,NULL值是花在運動上的時間。我希望連續停止(id列是按時間順序),以便能夠用某種標識符進行標識。這是我想什麼:

ID Stop StopID 
------------------ 
1 NULL NULL 
2 100  1 
3 NULL NULL 
4 50  2 
5 100  2 
6 210  2 
7 300  2 
8 NULL NULL 
9 NULL NULL 
10 20  3 
11 70  3 

我一直在擺弄這個查詢,但我似乎無法得到它的權利:

select a.id, a.Stop, 
     (case when a.Stop IS NOT NULL 
      then sum(case when a.Stop IS NOT NULL then 1 end) over (partition by x order by id) 
     end) as StopID 
from (select a.*, 
      sum(case when a.Stop IS NOT NULL then 0 else 1 end) over (order by id) as x 
     from data a 
    ) a 

它產生如下:

ID Stop StopID 
------------------- 
1 NULL NULL 
2 100  1 
3 NULL NULL 
4 50  1 
5 100  2 
6 210  3 
7 300  4 
8 NULL NULL 
9 NULL NULL 
10 20  1 
11 70  2 

回答

1
create table #t (ID int, Stop int) 

insert #t values 
(1, NULL), 
(2, 100), 
(3, NULL), 
(4, 50), 
(5, 100), 
(6, 210), 
(7, 300), 
(8, NULL), 
(9, NULL), 
(10, 20), 
(11, 70) 

select id, stop, 
case when stop is null then null else sum(case when stop is null then 1 else 0 end) over(order by id) end as stop_id 
from #t