查找行更改(带有重复项)和输出到表

时间:2017-03-08 15:16:22

标签: sql select sql-server-2014

我发布了一个问题(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。

2 个答案:

答案 0 :(得分: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并盯着结果,您可能会“得到”差异如何找到您要查找的组。

答案 1 :(得分:0)

如果我理解你的问题并且你想要做的就是包含重复项,你可以删除where子句"其中rn = 1"来自查询。