2014-01-23 54 views
0

我有以下一組數據(採樣給出)T-SQL中刪除「複製/不感興趣」的數據行

ID   Status Code Type  ModDate 
1234  1  1  AB   1995-04-01 
1234  1  1  CD   1998-08-31 
1234  1  1  AB   2003-08-31 
1234  1  NULL AB   2008-11-08 
1234  1  2  AB   2013-11-09 
1234  1  1  EF   2013-11-18 
... 

由於這些數據必須在某種時間表的觀察,我想閱讀只是從數據庫以下,因爲只有Type變化感興趣:

ID   Status Code Type  ModDate 
1234  1  1  AB   1995-04-01 
1234  1  1  CD   1998-08-31 
1234  1  1  AB   2003-08-31 
1234  1  1  EF   2013-11-18 
... 

如何才能做到這一點?我試圖對數據進行分區並給出一些行號,但是由於Type已分組,因此它會讓我頭疼。

SELECT 
    ID, Status, Code, Type, ModDate, 
    MIN(ModDate) OVER (PARTITION BY ID, Type) MinModDate, 
    MAX(ModDate) OVER (PARTITION BY ID, Type) MaxModDate, 
    ROW_NUMBER() OVER (PARTITION BY ID, Type ORDER BY ModDate) RowNumber 
FROM Data 

輸出:

ID   Status Code Type  ModDate  MinModDate MaxModDate RowNumber 
1234  1  1  AB  1995-04-01 1995-04-01 2013-11-09 1 
1234  1  1  CD  1998-08-31 1998-08-31 1998-08-31 1 
1234  1  1  AB  2003-08-31 1995-04-01 2013-11-09 2 
1234  1  NULL AB  2008-11-08 1995-04-01 2013-11-09 3 
1234  1  2  AB  2013-11-09 1995-04-01 2013-11-09 4 
1234  1  1  EF  2013-11-18 2013-11-18 2013-11-18 1 
... 

輸出預計:

ID   Status Code Type  ModDate  MinModDate MaxModDate RowNumber 
1234  1  1  AB  1995-04-01 1995-04-01 2013-11-09 1 
1234  1  1  CD  1998-08-31 1998-08-31 1998-08-31 1 
1234  1  1  AB  2003-08-31 1995-04-01 2013-11-09 1 
1234  1  NULL AB  2008-11-08 1995-04-01 2013-11-09 2 
1234  1  2  AB  2013-11-09 1995-04-01 2013-11-09 3 
1234  1  1  EF  2013-11-18 2013-11-18 2013-11-18 1 
... 

可以這樣不使用遊標容易實現?

+0

爲什麼預期輸出第二,第三和第四行得到不1,2,3行號,如果PARTITION BY ID和TYPE? – Darka

+0

分區對'Type = AB'的所有行起作用,然後應用排序。這就是爲什麼第三行有'RowNumber = 2'而不是1,但這將是很好,因爲我可以通過'RowNumber = 1'過濾 – Scoregraphic

+0

哦,你想要通過相同的訂單放行號。得到它了。 – Darka

回答

1

,因爲您使用2012那麼這應該工作:

SELECT ID, Status, Code, Type, ModDate FROM 
(
SELECT 
    ID, Status, Code, Type, ModDate, 
    lag(type,1) OVER (ORDER BY ID, moddate) prevtype 
FROM data 
)t WHERE type<>ISNULL(prevtype,'') 
+0

現在第一行缺少'1234 1 1 AB 1995-04-01'。是否因爲在這種情況下沒有前一行? – Scoregraphic

+0

我在我的機器上測試過它,第一行就在那裏。當沒有前一行時,isnull(prevtype,'')應該保護。 – Jayvee

+0

注意到over(order by)現在是ID,ModDate – Jayvee

0

如果我理解正確的,你只需要包裝你的原始SQL:

SELECT ID, Status, Code, Type, ModDate FROM 
(
SELECT 
    ID, Status, Code, Type, ModDate, 
    MIN(ModDate) OVER (PARTITION BY ID, Type) MinModDate, 
    MAX(ModDate) OVER (PARTITION BY ID, Type) MaxModDate, 
    ROW_NUMBER() OVER (PARTITION BY ID, Type ORDER BY ModDate) RowNumber 
FROM Data 
) t 
WHERE ModDate=MinModDate 
+0

使用此語句,數據爲'1234 1 1 AB 2003-08-31'的行丟失 – Scoregraphic

1

分區中的數據是你想要的,你只需要通過類型做,因爲感興趣的唯一變化。您還需要添加ROW_NUMBER()函數以過濾所需的行。這是一個更新的查詢。

;WITH cte AS 
(
    SELECT ID, [Status], Code, [Type], ModDate 
      ,rn = ROW_NUMBER() OVER (PARTITION BY ModDate ORDER BY ModDate) 
    FROM #data 
) 
SELECT ID, [Status], Code, [Type], ModDate 
FROM cte 
WHERE rn = 1 
ORDER BY ModDate, [Type] 
+0

使用此語句,數據爲'1234 1 1 AB 2003-08-31'缺少 – Scoregraphic

+0

如果Type是您所感興趣的是Type by Mod,那麼爲什麼應該包含AB行?根據數據不清楚。 – mrrodd

+0

我想在時間線上的Type列中顯示更改,當然可以將Type返回到過去已經存在的值,並且也可以使用相同的值再次保存記錄。我試圖忽略這些「相同的價值」。 – Scoregraphic