每年的SQL重新启动编号顺序

时间:2019-02-06 16:16:33

标签: sql sql-server

我正在努力创建一个简单的维修日志序列号。我想为每次维修创建一个唯一的代码,但是我不想数字永远持续下去,我想使用Zone(department),Year和Number来标识每次维修。我正在使用SQL Server 17。 我知道我可以将这些字段连接在一起以创建数字,但是我不确定如何在年初重新设置数字?

(图片有助于描述)

谢谢!

enter image description here

4 个答案:

答案 0 :(得分:0)

假设您不想建立联系,请像这样使用Row_Number

Select *, Row_Number() over (partition by Year order by [date?])
From MyTable

[date?]替换为您必须在年内发出订单信号的任何标识符。

partition by year告诉它每隔一年重新从1开始编号。

答案 1 :(得分:0)

这会生成随机排序的“维修编号”

SELECT 
  zone, 
  year, 
  row_number() OVER (PARTITION BY year ORDER BY (SELECT 1)) AS [Repair Number]
FROM t

串联的:

SELECT
  zone,
  year,
  [Repair Number],
  zone + CAST(year AS VARCHAR) + CAST([Repair Number] AS VARCHAR) AS [Concatenated]
FROM (
  SELECT 
    zone, 
    year, 
    row_number() OVER (PARTITION BY year ORDER BY (SELECT 1)) AS [Repair Number]
  FROM t
) t

当然,您可能不应该分配随机数,而应确定性地分配它们,例如基于ID /身份等,因此用更有意义的内容替换ORDER BY (SELECT 1)

答案 2 :(得分:0)

如果表中的每一行都需要一个唯一的数字,请使用identity主键。不会每年重置一次。它可能有空白-例如删除行时。但这是完成所需目标的最有效方法。

如果尝试在输入上创建自己的值,那么从本质上讲,您必须在计算下一个数字时锁定整个表。这将锁定其他更新并插入到表中,因此这是一项昂贵的操作。如果不这样做,您将受到竞争条件的影响,其中可能为两个不同的线程分配相同的编号。

标识列在美学上可能并不令人满意,但这实际上是标识表中行的最佳解决方案。

答案 3 :(得分:0)

如果您使用的是身份值,则可以使用以下方法将种子身份重置为所需的任何内容:

DBCC CHECKIDENT ('TableName', RESEED, 5000)

请记住,身份并不能保证唯一的值-仅比先前使用的值大一个。上面的代码将下一个标识重置为5001。

如果使用序列,则可以使用

更改序列
  

ALTER SEQUENCE dbo.Seq1重新启动为5000;