0

我有以下結構的SQL Server表:查找行更改和輸出表

id  TransDate   PartType 
====================================== 
1  2016-06-29 10:23:00 A1 
2  2016-06-29 10:30:00 A1 
3  2016-06-29 10:32:00 A2 
4  2016-06-29 10:33:00 A2 
5  2016-06-29 10:35:00 A2 
6  2016-06-29 10:39:00 A3 
7  2016-06-29 10:41:00 A4 

我需要一個SELECT語句,將輸出發現在PartType的變化,看起來像這樣的表(SSRS爲目的):

PartType StartTime    EndTime  
======================================================= 
A1   2016-06-29 10:23:00 2016-06-29 10:32:00 
A2   2016-06-29 10:32:00 2016-06-29 10:39:00 
A3   2016-06-29 10:39:00 2016-06-29 10:41:00 
A4   2016-06-29 10:41:00 NULL 

注意,StartTime總是從最近EndTime回升,除非它是在表中的第一條記錄。

我的SELECT聲明應該是什麼?我似乎無法獲得預期的結果。

編輯:我正在使用SQL Server 2008 R2;我應該指出這一點。

回答

1

在SQL Server 2012及更高版本,您可以使用此:

declare @t table (id int, transdate datetime2(0), parttype char(2)) 

insert @t 
values 
(1,  '2016-06-29 10:23:00', 'A1'), 
(2,  '2016-06-29 10:30:00', 'A1'), 
(3,  '2016-06-29 10:32:00', 'A2'), 
(4,  '2016-06-29 10:33:00', 'A2'), 
(5,  '2016-06-29 10:35:00', 'A2'), 
(6,  '2016-06-29 10:39:00', 'A3'), 
(7,  '2016-06-29 10:41:00', 'A4') 

;with x as (
select *, row_number() over(partition by parttype order by transdate) rn 
from @t 
) 
select parttype, transdate starttime, lead(transdate) over (order by transdate) from x where rn = 1 
+0

對不起,我正在使用SQL Server 2008 R2。我編輯了OP。 – controller

2

嗯,這裏是一個使用outer applygroup by一個方法:

select t1.PartType, min(t1.TransDate) as StartTime, t2.TransDate 
from t t1 
outer apply 
    (select top 1 t2.* 
     from t t2 
     where t2.PartType <> t1.PartType and t2.TransDate > t1.TransDate 
     order by t2.TransDate asc 
    ) t2 
group by t1.PartType, t2.TransDate; 
+0

這是難得一見外應用的例子! – BIDeveloper

+1

這不起作用 - t1定義在哪裏? – controller

+0

這確實是一個丟失的't'表別名。看一看。 –