2017-03-08 38 views
0

我發佈了一個問題(Find Row Changes and Output to Table),該問題涉及確定列值發生變化的表中的行,並將結果輸出到表中。 (當然,從公認的答案幫助,)成功的查詢結果如下:查找行更改(帶重複項)並輸出到表

;with x as (
select *, row_number() over(partition by ModelNum order by transdate) rn 
from table 
) 
select ModelNum, TransDate as 'StartTime', lead(TransDate) over (order by TransDate) as 'EndTime' from x where rn = 1 

我的問題,雖然是原來的表中有重複的ModelNum,但我是從使用的代碼解決方案沒有考慮到它們。它只是掃描整個表格並尋找第一個和最後一個值。換句話說,如果原來的表是這樣的:

id  TransDate   PartType 
====================================== 
1  2016-06-29 10:23:00 A 
2  2016-06-29 10:30:00 A 
3  2016-06-29 10:32:00 C 
4  2016-06-29 10:33:00 C 
5  2016-06-29 10:35:00 C 
6  2016-06-29 10:39:00 A 
7  2016-06-29 10:41:00 A 
8  2016-06-29 10:43:00 B 

我如何將結果輸出到一個表,這樣重複列太多,就像這樣:

PartType StartTime    EndTime  
======================================================= 
A   2016-06-29 10:23:00 2016-06-29 10:32:00 
C   2016-06-29 10:32:00 2016-06-29 10:39:00 
A   2016-06-29 10:39:00 2016-06-29 10:43:00 
B   2016-06-29 10:43:00 NULL 

此外,在原來的問題,我正在使用SQLServer 2008,但現在我使用2014.

回答

1

這是一個缺口和孤島問題。我喜歡用行號的方法解決它:

with x as (
     select t.*, 
      row_number() over (order by transdate) as seqnum, 
      row_number() over (partition by ModelNum order by transdate) as seqnum_m 
     from table t 
    ) 
select ModelNum, min(TransDate) as StartTime, max(TransDate) as EndTime 
from x 
group by ModelNum, (seqnum - seqnum_m); 

這是如何工作的有點棘手。如果你運行CTE並盯着結果,你可能會「得到」差異如何找到你正在尋找的組。

+0

優雅。謝謝 – controller

0

如果我理解你的問題,並且你想要做的只是包含重複項,你可以從查詢中刪除where子句「where rn = 1」。