2017-11-29 8 views
0

私は毎日変数V1の状態を保存するSQL Serverテーブルがあるという問題に直面しています。私は変数がその状態を変え、新しい状態が何であるかという情報だけに興味があります。SQL Serverテーブルの最初の変更のためのフィルタ

V1 Status Date 
----------------- 
X A  date_1 
Y C  date_2 
X B  date_3 
X B  date_4 
Y D  date_5 
X B  date_6 
Y D  date_7 
X A  date_8 

結果のテーブルが好きなはずです

V1 Status Date 
----------------- 
X A  date_1 
X B  date_3 
X A  date_8 
Y C  date_2 
Y D  date_5 

誰かがこの仕事をしていませんT-SQLステートメントを提供することができます:

元のテーブルには、指定されたスキーマを次の?

おかげ

答えて

1

あなたは簡単にLAG窓関数を使用してこれを達成することができます

;WITH CTE AS (
    SELECT V1, Status, [Date],  
      LAG(Status) OVER (PARTITION BY V1 ORDER BY [Date]) prev_Status 
    FROM mytable 
) 
SELECT V1, Status, [Date] 
FROM CTE 
WHERE prev_Status IS NULL OR prev_Status <> Status 

CTE直前行のStatus値を取得するためにLAGを使用しています。 PARTITION句を使用して、V1グループごとにこれを個別に実行します。

注:LAGあなたはこれを使用することができますSQL Server 2012の

0

からのみ利用可能です。これは、SQL Server 2008以上で動作します。

DECLARE @Temp TABLE (V1 VARCHAR(10), Status VARCHAR(10), Date VARCHAR(10)) 
INSERT INTO @Temp VALUES 
('X', 'A', 'date_1'), 
('Y', 'C', 'date_2'), 
('X', 'B', 'date_3'), 
('X', 'B', 'date_4'), 
('Y', 'D', 'date_5'), 
('X', 'B', 'date_6'), 
('Y', 'D', 'date_7'), 
('X', 'A', 'date_8') 

;WITH CTE AS (
    select *, RN = ROW_NUMBER() OVER (PARTITION BY V1 ORDER BY Date) FROM @Temp 
) 
SELECT T1.V1, T1.Status, T1.Date 
FROM 
    CTE T1 
    LEFT JOIN CTE T2 ON T1.V1 = T2.V1 AND T1.RN = (T2.RN + 1) 
WHERE T2.Status IS NULL OR T2.Status <> T1.Status 

結果:

V1   Status  Date 
---------- ---------- ---------- 
X   A   date_1 
X   B   date_3 
X   A   date_8 
Y   C   date_2 
Y   D   date_5 
関連する問題