识别新值时从 1 开始计数

jmich738

我需要创建一个列,每次找到不同的值时,该列将从 1 开始计数。

这是我的表的示例:

if object_id('tempdb.dbo.#myTable') is not null drop table #myTable
create table #myTable (dates int, flag char)

insert into #myTable values('20181031','V')
insert into #myTable values('20181130','V')
insert into #myTable values('20181231','V')
insert into #myTable values('20190131','F')
insert into #myTable values('20190228','F')
insert into #myTable values('20190331','F')
insert into #myTable values('20190430','F')
insert into #myTable values('20190531','V')
insert into #myTable values('20190630','V')
insert into #myTable values('20190731','V')

select *
from #myTable
order by 1

dates     flag
20181031    V
20181130    V
20181231    V
20190131    F
20190228    F
20190331    F
20190430    F
20190531    V
20190630    V
20190731    V

我需要输出如下所示:

dates      flag cnt
20181031    V   1
20181130    V   2
20181231    V   3
20190131    F   1
20190228    F   2
20190331    F   3
20190430    F   4
20190531    V   1
20190630    V   2
20190731    V   3

我曾尝试使用row_number()with 子查询的变体,但是当它遇到第二组 Vs 时,我无法让它再次开始计数。我查看了这两个解决方案,但我无法根据我的目的推断它:
计数行直到满足 where 子句条件

Transact-SQL - 编号行直到条件满足

我正在使用 SQL Server 2012

谢谢

戈登·利诺夫

这是一种间隙和岛屿问题。最简单的解决方案是使用行号的差异来定义组。然后为您想要的列添加一个额外的行号:

select t.*,
       row_number() over (partition by flag, seqnum - seqnum_2 order by date) as cnt
from (select t.*,
             row_number() over (order by date) as seqnum,
             row_number() over (partition by flag order by date) as seqnum_2
      from #mytable t
     ) t
order by date;

是一个 db<>fiddle。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么javascript getMonth从0开始计数,getDate从1开始计数?

每次添加新音轨时递增计数器,并始终选择尚未分配的最小值(> = 1)

如何让vim使用从1而不是0开始计数的相对行号

For循环在期望> 1时返回1的计数

从1开始,当我最多可以使用N次时,我可以计数多远

计数器不会在页面加载时开始计数

SQLite选择计数记录从10小时前开始

重置按钮计数,以便在删除所有按钮之后再次从按钮1开始

如何使tmux计数窗口从1而不是0开始?

通过在XSLT中开始/结束属性值来计数元素

当计数器从1开始时,递归方法上的堆栈溢出

jQuery在计数器开始计数时单击更改

从2015年1月1日00:00:01开始以2015年1月357开始计数

带字节计数器的For循环在开始时挂起

在开始时显示总计数值

开始活动时如何更新日期计数器

SQL:当计数为 1 时显示值

使用 xsl:number 元素时从 0 开始计数而不是 1

当新的不同字段显示回 1 并向上计数时,从 1 查找 Oracle 函数计数

值 = 1 时的 SQL 计数

Spark:重新开始计数特定值

以特定值开始计数 columnName

如何使while循环从1开始计数

为什么我的迭代计数从 2 而不是 1 开始?

当 R 中的分类变量的值发生变化时如何开始新的计数

forEach 索引从 1 而不是 0 开始计数?

删除一行ajax时如何从1开始计数?

使用 ui 文本计算上次访问的航点时,如何使其从 1 而不是 0 开始计数?

SQL Server 根据定义的起始值开始每行计数?