T-SQL基于列值的变化递增计数器

时间:2015-04-01 00:01:04

标签: sql-server tsql sql-server-2014

我有如下的样本表。该表按另一个未显示的列排序。我需要根据值列中的更改来增加计数器列值。请参阅下面的示例。如何在T-SQL(SQL Server 2014)中完成此操作。

ID Value
1  3
2  3
3  2
4  2
5  2
6  3
7  0
8  0

预期产出:

ID Value Counter
1  3     1
2  3     1
3  2     2
4  2     2
5  2     2
6  3     3
7  0     4
8  0     4

1 个答案:

答案 0 :(得分:6)

在SQL Server 2012及更高版本中,您可以享受1)分析功能,以及2)运行总计:

declare @t table (
    Id int primary key,
    Value int not null
);

insert into @t (Id, Value)
values
(1, 3),
(2, 3),
(3, 2),
(4, 2),
(5, 2),
(6, 3),
(7, 0),
(8, 0);

select sq.Id, sq.Value,
    sum(case when sq.pVal = sq.Value then 0 else 1 end) over(order by sq.Id) as [Counter]
from (
    select t.Id, t.Value, lag(t.Value, 1, null) over(order by t.Id) as [pVal]
    from @t t
) sq
order by sq.Id;

此外,此解决方案不依赖于ID列没有间隙。