2017-04-21 54 views
0

因此,我有一个请求历史记录表,我想标记其版本(版本基于循环结束);我能够标记周期的结束,但不知何故我无法更新每个周期相关的每个值。这里有一个例子:基于行值的派生和更新列值SQL Server

|history_id | Req_id | StatID | Time  |EndCycleDate | 
    |-------------|---------|-------|---------- |-------------| 
    |1   | 1  |18  | 3/26/2017 | NULL  | 
    |2   | 1  | 19 | 3/26/2017 | NULL  | 
    |3   | 1  |20  | 3/30/2017 | NULL  | 
    |4   |1  | 23 |3/30/2017 | NULL  | 
    |5   | 1  |35  |3/30/2017 | 3/30/2017 | 
    |6   | 1  |33  |4/4/2017 | NULL  | 
    |7   | 1  |34  |4/4/2017 | NULL  | 
    |8   | 1  |39  |4/4/2017 | NULL  | 
    |9   | 1  |35  |4/4/2017 | 4/4/2017 | 
    |10   | 1  |33  |4/5/2017 | NULL  | 
    |11   | 1  |34  |4/6/2017 | NULL  | 
    |12   | 1  |39  |4/6/2017 | NULL  | 
    |13   | 1  |35  |4/7/2017 | 4/7/2017 | 
    |14   | 1  |33  |4/8/2017 | NULL  | 
    |15   | 1  | 34 |4/8/2017 | NULL  | 
    |16   | 2  |18  |3/28/2017 | NULL  | 
    |17   | 2  |26  |3/28/2017 | NULL  | 
    |18   | 2  |20  |3/30/2017 | NULL  | 
    |19   | 2  |23  |3/30/2017 | NULL  | 
    |20   | 2  |35  |3/30/2017 | 3/30/2017 | 
    |21   | 2  |33  |4/12/2017 | NULL  | 
    |22   | 2  |34  |4/12/2017 | NULL  | 
    |23   | 2  |38  |4/13/2017 | NULL  | 

现在我想达到的目的是为了获得一个新列,即VER,并更新像下面的值:自带非常接近

|history_id | Req_id | StatID | Time  |EndCycleDate | VER | 
    |-------------|---------|-------|---------- |-------------|------| 
    |1   | 1  |18  | 3/26/2017 | NULL  | 1 | 
    |2   | 1  | 19 | 3/26/2017 | NULL  | 1 | 
    |3   | 1  |20  | 3/30/2017 | NULL  | 1 | 
    |4   |1  | 23 |3/30/2017 | NULL  | 1 | 
    |5   | 1  |35  |3/30/2017 | 3/30/2017 | 1 | 
    |6   | 1  |33  |4/4/2017 | NULL  | 2 | 
    |7   | 1  |34  |4/4/2017 | NULL  | 2 | 
    |8   | 1  |39  |4/4/2017 | NULL  | 2 | 
    |9   | 1  |35  |4/4/2017 | 4/4/2017 | 2 | 
    |10   | 1  |33  |4/5/2017 | NULL  | 3 | 
    |11   | 1  |34  |4/6/2017 | NULL  | 3 | 
    |12   | 1  |39  |4/6/2017 | NULL  | 3 | 
    |13   | 1  |35  |4/7/2017 | 4/7/2017 | 3 | 
    |14   | 1  |33  |4/8/2017 | NULL  | 4 | 
    |15   | 1  | 34 |4/8/2017 | NULL  | 4 | 
    |16   | 2  |18  |3/28/2017 | NULL  | 1 | 
    |17   | 2  |26  |3/28/2017 | NULL  | 1 | 
    |18   | 2  |20  |3/30/2017 | NULL  | 1 | 
    |19   | 2  |23  |3/30/2017 | NULL  | 1 | 
    |20   | 2  |35  |3/30/2017 | 3/30/2017 | 1 | 
    |21   | 2  |33  |4/12/2017 | NULL  | 2 | 
    |22   | 2  |34  |4/12/2017 | NULL  | 2 | 
    |23   | 2  |38  |4/13/2017 | NULL  | 2 | 
+1

如果删除了''----行,它会变得更加容易阅读的问题。 – jarlh

+0

完成。希望现在很清楚。 – user2597012

回答

2

一种方法是累积计数:

select t.*, 
     count(endCycleDate) over (partition by req_id order by history_id) as ver 
from t; 

但是,当endCycle日期定义完全正确时,它不会得到该值。和值从0开始。这些问题大部分是固定的一个窗口子句:

select t.*, 
     (count(endCycleDate) over (partition by req_id 
            order by history_id 
            rows between unbounded preceding and 1 preceding) + 1 
     ) as ver 
from t; 

但是,错过第一排第一个的值。所以,这是一个实际工作的方法。它枚举值落后,然后从总减去得到升序版本:

select t.*, 
     (1 + count(*) over (partition by req_id) - 
     (count(endCycleDate) over (partition by req_id 
            order by history_id desc) 
     ) as ver 
from t; 
+0

我认为'和1优先)'这应该是1以下 – TheGameiswar

+0

哇!谢谢你快速的回复!然而,我运行它,与我的想法有点不同。而不是1 Ver开始,一直到8 – user2597012

+1

@TheGameiswar。 。 。这是行不通的。这只适用于比如历史id 8,但不适用于之前的历史。 –