2011-08-11 21 views
4

私は "生産"テーブルのレコードの変更を "履歴"テーブルに記録するアプリケーションを持っています。履歴テーブルは基本的に、本番テーブルのフィールドコピーのフィールドです。最後に変更された日付、最後にユーザーによって変更された列などが追加されます。T-SQL履歴テーブルのステータス変更を確認します

これは、レコードのスナップショット変更。ただし、レコードのユニークなステータス変更を判断することは困難です。以下に例を示します。

BoxID StatusID SubStatusID ModifiedTime 
1   4   27  2011-08-11 15:31 
1   4   11  2011-08-11 15:28 
1   4   11  2011-08-10 09:07 
1   5   14  2011-08-09 08:53 
1   5   14  2011-08-09 08:19 
1   4   11  2011-08-08 14:15 
1   4   9  2011-07-27 15:52 
1   4   9  2011-07-27 15:49 
1   2   8  2011-07-26 12:00 

あなたがBoxID 1は、生産履歴の9つの変更があった(データは簡潔さとセキュリティのために取り外し、他の分野との実際のシステムから来ている)上記の表に見ることができるように。これらの更新によってステータスが変更されたり、ステータスが変更されたりすることがありました。これは、他のフィールド(図示せず)が変更されたことを意味します。

このデータから一意のステータス変更を抽出できるようにする必要があります。上記の入力表を見れば、私が探している出力は以下の通りです。

BoxID StatusID SubStatusID ModifiedTime 
1   4   27  2011-08-11 15:31 
1   4   11  2011-08-10 09:07 
1   5   14  2011-08-09 08:19 
1   4   11  2011-08-08 14:15 
1   4   9  2011-07-27 15:49 
1   2   8  2011-07-26 12:00 

これはStatusIDとSubStatusIDによってグループ分けして、min(ModifiedTime)を取って戻ってステータスが同様に後方に行くことができますので、履歴テーブルに参加するほど簡単ではありません(、StatusID 4参照11は二回設定されますSubStatusID)。

ご協力いただければ幸いです!

答えて

5

このお

;WITH Boxes_CTE AS 
    (
    SELECT Boxid, StatusID, SubStatusID, ModifiedTime, 
     ROW_NUMBER() OVER (PARTITION BY Boxid ORDER BY ModifiedTime) AS SEQUENCE 
    FROM Boxes 
    ) 

SELECT b1.Boxid, b1.StatusID, b1.SubStatusID, b1.ModifiedTime 
FROM Boxes_CTE b1 
LEFT OUTER JOIN Boxes_CTE b2 ON b1.Boxid = b2.Boxid 
      AND b1.Sequence = b2.Sequence + 1 
WHERE b1.StatusID <> b2.StatusID 
    OR b1.SubStatusID <> b2.SubStatusID 
    OR b2.StatusID IS NULL 
ORDER BY b1.ModifiedTime DESC 
; 
+0

を確認してください。これは非常にうまくいきました。ありがとうございました! – thomas

2
Select BoxID,StatusID,SubStatusID FROM Staty CurrentStaty 
INNER JOIN ON 
(
Select BoxID,StatusID,SubStatusID FROM Staty PriorStaty 
) 
Where Staty.ModifiedTime= 
          (Select Max(PriorStaty.ModifiedTime) FROM PriorStaty 
          Where PriortStaty.ModifiedTime<Staty.ModifiedTime) 
AND Staty.BoxID=PriorStaty.BoxID 
AND NOT (
     Staty.StatusID=PriorStaty.StatusID 
     AND 
     Staty.SubStatusID=PriorStaty.StatusID 
) 
+0

のための仕事をあなたのコードをフォーマットするために、{}ボタンまたはCtrl-Kを使用することができてい。 – bobs

+0

あなたは構文エラーがあると思う。 INNER JOIN ON – bobs

関連する問題