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

Posted

技术标签:

【中文标题】基于列值变化的 T-SQL 递增计数器【英文标题】:T-SQL incrementing counter based on change in a column value 【发布时间】:2015-06-05 11:57:22 【问题描述】:

我有如下示例表。该表按未显示的另一列排序。我需要根据值列的变化来增加计数器列的值。请参阅下面的示例。如何在 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】:

在 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 列。

【讨论】:

以上是关于基于列值变化的 T-SQL 递增计数器的主要内容,如果未能解决你的问题,请参考以下文章

表中的递增/递减计数值取决于使用 postgresql 中的触发器插入/删除另一个表的特定列值

如何生成每年重置的自动递增 ID 号

在 T-SQL 中使用 PIVOT 需要帮助

ReactJS:函数内部无法识别状态变化?

在唯一列值的熊猫上应用计数器[重复]

AUTOINCREMENT 自动增量