SQL 增量计数器

SQL Increment Counter

我有一列的值类似于

2014.STA.?
2014.STA.?
2014.STA.?
2015.STA.?
2016.STA.?
2014.STA.?
2014.STA.?
2016.STA.?

我需要创建一个可以按年份分组并添加索引而不是“?”的函数。这意味着,我想要得到这样的结果

2014.STA.1
2014.STA.2
2014.STA.3
2015.STA.1
2016.STA.1
2014.STA.4
2014.STA.5
2016.STA.2

我不知道如何将这些列分组并在函数中使用它。

对于 mssql2008

使用Row_Numberwindow函数生成数字

select left(yourcol,len(yourcol)-1)+cast(RN as varchar(20)) 
(
select row_number()over(partition by your_col order yourcol) As RN,*
From yourtable
)

我认为这符合您的要求:

select (left(col, 9) +
        cast(row_number() over (partition by left(col, 9) order by (select null)) as varchar(255))
       )

注意:这对值进行了任意排序。据推测,有一列指定了数字的正确顺序。

实际上,您可以在没有 cast() 的情况下使用 replace():

select replace(col, '?', 
               row_number() over (partition by left(col, 9) order by (select NULL))
              )

cast() 隐含在此版本中。

select substring(c1, 1, 9) + CONVERT(CHAR, ROW_NUMBER() OVER (partition by c1 ORDER BY substring(c1,1,4)))  from @tabla

它适用于我的 SQL Server 2014。检查这个:

select substring(c1, 1, 9) + cast(ROW_NUMBER() OVER (partition by c1 ORDER BY substring(c1,1,4)) as char(12))  from @tabla

如果您想按号码订购:

select r1 from (
select substring(c1, 1, 9) + cast(ROW_NUMBER() OVER (partition by c1 ORDER BY substring(c1,1,4)) as char(12)) AS r1 from @tabla) AS T
order by substring(r1, 10, len(r1))