2017-04-21 10 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の日付が正確に正しく定義されている場合、この値は取得されません。

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; 

しかし、それは最初の行の最初の1に値をミス:そして値は0から始まります。これらの問題のほとんどは、ウィンドウ句で固定されています。だから、実際に働く方法はここにあります。これは、値後方を列挙して、昇順でバージョンを取得するために、合計から減算:

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

WOW!早速の対応、ありがとうございました!私はそれを走らせましたが、私が心に留めていたものとは多少異なっています。 1 Verの代わりに16で始まって8まで – user2597012

+1

@TheGameiswar。 。 。それは動作しません。それは、例えば、歴史id 8のためだけに働いていますが、それ以前のものはそうではありません。 –

関連する問題