2017-10-31 10 views
-1

次の特性を持つテーブルがあります。 RecordId固有の識別子 日付、重量およびコントロール(そうでない場合は1より大きい場合は1)。ブロック内の増加値の割り当て

RecordID Date Weight Control 
1   16/07/2014 12200 1 
2   16/07/2014 0  0 
3   16/07/2014 5720 0 
4   16/07/2014 11060 1 
5   16/07/2014 15940 1 
6   16/07/2014 16200 1 
7   16/07/2014 16080 1 
8   16/07/2014 16080 1 
9   16/07/2014 16080 1 
10   18/07/2014 16080 1 
11   18/07/2014 3720 0 
12   18/07/2014 4500 0 
13   18/07/2014 23800 1 
14   18/07/2014 40700 1 
15   18/07/2014 40700 1 

そして、私は次のように0と1と同じ増加の各グループに割り当てる新しい列(グループ)を追加したいと思います:

RecordID Date Weight Control Group 
1   16/07/2014 12200 1 1 
2   16/07/2014 0  0 2 
3   16/07/2014 5720 0 2 
4   16/07/2014 11060 1 3 
5   16/07/2014 15940 1 3 
6   16/07/2014 16200 1 3 
7   16/07/2014 16080 1 3 
8   16/07/2014 16080 1 3 
9   16/07/2014 16080 1 3 
10   18/07/2014 16080 1 3 
11   18/07/2014 3720 0 4 
12   18/07/2014 4500 0 4 
13   18/07/2014 23800 1 5 
14   18/07/2014 40700 1 5 
15   18/07/2014 40700 1 5 

が、私はこのパズルを解決するために助けてくださいを。

+0

どのデータベースですか? MS SQL、MySQL、Oracle?あなたの質問に関連するタグを追加してください。 – ekad

+0

[よくある質問](https://stackoverflow.com/help/how-to-ask)を読んで質問を編集してください – ncfirth

答えて

0

私はMicrosoft Transact SQLを使用していると仮定しています。

ここでは、CASE WHENステートメントを使用してコントロール列の変更を識別するソリューションを示します。

私は、下のT-SQLの元のデータ(RecordID、日付、重量、およびコントロール)を「Flori」としてテーブルに命名しました。

SELECT  f.RecordID, f.Date, f.Weight, f.Control, 
      SUM(x.Change) OVER (ORDER BY f.RecordId) + 1 as [Group] 
FROM 
      (SELECT RecordID, 
       (SELECT 
        CASE 
         WHEN Control != 
          (SELECT Control FROM Flori WHERE RecordId = f.RecordID - 1) 
          THEN 1 
         ELSE 0 
        END 
       ) as Change 
      FROM Flori as f) as x 
INNER JOIN Flori f on x.RecordID = f.RecordID 
GROUP BY f.RecordID, f.Date, f.Weight, f.Control, x.Change 
関連する問題