当列值更改时,如何将组编号添加到SQL Server 2012中的顺序记录?

时间:2017-01-12 18:15:03

标签: sql sql-server sql-server-2012 window-functions

我一直在使用SQL Server 2012中的窗口函数,并且无法使其工作,因为我希望避免使用游标并逐行进行。我的问题是我需要为每条记录添加一个组号。棘手的部分是每次列值更改时组号都必须递增,即使它更改回记录序列中较早之前存在的值。

以下是数据和我想要的结果的一个例子:

if object_id('tempdb..#data') is not null 
    drop table #data

create table #data
(
    id int identity(1,1)
    ,mytime datetime
    ,distance int
    ,direction varchar(20)
)

insert into #data (mytime, distance, direction) 
values 
 ('2016-01-01 08:00',10,'North')
,('2016-01-01 08:30',18,'North')
,('2016-01-01 09:00',15,'North')
,('2016-01-01 09:30',12,'South')
,('2016-01-01 10:00',16,'South')
,('2016-01-01 10:30',45,'North')
,('2016-01-01 11:00',23,'North')
,('2016-01-01 11:30',14,'South')
,('2016-01-01 12:00',40,'South')

期望的结果:

mytime              Distance    Direction   GroupNumber
--------------------------------------------------------
2016-01-01 8:00     10          North       1
2016-01-01 8:30     18          North       1
2016-01-01 9:00     15          North       1
2016-01-01 9:30     12          South       2
2016-01-01 10:00    16          South       2
2016-01-01 10:30    45          North       3
2016-01-01 11:00    23          North       3
2016-01-01 11:30    14          South       4
2016-01-01 12:00    40          South       4

这可以使用窗口函数吗?

1 个答案:

答案 0 :(得分:4)

一种方法是

NSInteger

以上假设WITH T AS (SELECT *, CASE WHEN LAG(direction) OVER (ORDER BY ID) = direction THEN 0 ELSE 1 END AS Flag FROM #data) SELECT mytime, Distance, Direction, SUM(Flag) OVER (ORDER BY id) AS GroupNumber FROM T 不包含任何Direction。如果可能的话,需要进行微调。但是你还需要定义是否应该将两个连续的NULLs视为相等(假设情况如此,则下面的变体将起作用)

NULL