【问题标题】:Start counting from 1 when new value identified确定新值时从 1 开始计数
【发布时间】:2023-04-07 04:44:02
【问题描述】:

我需要创建一个列,每次找到不同的值时都会从 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() 的变体,但是当它到达第二组 Vs 时,我无法让它重新开始计数。 我查看了这两个解决方案,但我无法将其推断为我的目的:
Counting rows until where clause condition is saatisfied

Transact-SQL - number rows until condition met

我使用的是 SQL Server 2012

谢谢

【问题讨论】:

  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。这个问题被称为间隙和孤岛,可以帮助您进行研究。
  • 我注意到您已经有一段时间没有接受答案了……有什么原因吗?
  • 你应该发布你的实际尝试,而不是仅仅提及它。
  • @DaleK 我添加了研究证据。关于接受答案,我需要再次查看它们,但通常我没有看到适合我的答案。
  • 如果某个答案不适合您,您应该评论作者如何以及为什么可以改进他们的答案。

标签: sql sql-server tsql


【解决方案1】:

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

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;

Here 是一个 dbfiddle。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2018-01-12
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多