查找行更改并输出到 Table
Find Row Changes and Output to Table
我有一个具有以下结构的 SQL 服务器 table:
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
语句来输出一个 table 来找到 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
开始,除非它是 table 中的第一条记录。
我的 SELECT
声明应该是什么?我似乎无法获得预期的结果。
编辑:我正在使用 SQL Server 2008 R2;我应该指定那个。
嗯,这是使用 outer apply
和 group 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;
对于 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
我有一个具有以下结构的 SQL 服务器 table:
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
语句来输出一个 table 来找到 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
开始,除非它是 table 中的第一条记录。
我的 SELECT
声明应该是什么?我似乎无法获得预期的结果。
编辑:我正在使用 SQL Server 2008 R2;我应该指定那个。
嗯,这是使用 outer apply
和 group 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;
对于 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