我正在努力创建一个简单的维修日志序列号。我想为每次维修创建一个唯一的代码,但是我不想数字永远持续下去,我想使用Zone(department),Year和Number来标识每次维修。我正在使用SQL Server 17。 我知道我可以将这些字段连接在一起以创建数字,但是我不确定如何在年初重新设置数字?
(图片有助于描述)
谢谢!
答案 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;