【问题标题】:SQL Increment CounterSQL 增量计数器
【发布时间】:2016-10-29 09:35:49
【问题描述】:

我有一列的值类似于

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

【问题讨论】:

    标签: sql-server counter increment


    【解决方案1】:

    我认为这是你想要的:

    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() 隐含在此版本中。

    【讨论】:

    • 感谢您的回复,第一个代码 as varchar(255).. 有问题。第二个代码,排名函数“row_number”必须有 ORDER BY 子句。错误
    • 我认为这段代码没有按日期分组?我需要按日期分组。如果您看到第一条消息,您将看到它是按年份分组的
    【解决方案2】:
    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))
    

    【讨论】:

    • 你的代码有点不同。我有这些结果
    • 2014.STA.124 2014.STA.125 2014.STA.72 2015.STA.12 2016.STA.64 2014.STA.295 2014.STA.105 2016.STA.65 2014。 STA.182
    • 它不是从1开始...第一个数字是124
    • 我检查了所有值都是正确的。唯一的问题是顺序。如何从 1 开始?任何想法
    【解决方案3】:

    使用Row_Number窗口函数生成数字

    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
    )
    

    【讨论】:

    • 我无法实现你的代码..它给出了很多错误..我有一个复杂的查询,很难实现这个
    猜你喜欢
    • 2023-02-22
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多