我发布了一个问题(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。
答案 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"来自查询。