[英]Conditional auto increment value in SQL server “SELECT”
表1中的可用数据
ID Name1 Address
1 nm1 abc
1 nm2 def
1 nm3 ghi
0 nm4 jkl
0 nm5 mno
0 nm6 pqr
1 nm7 stu
1 nm8 vwx
1 nm9 yza
0 nm10 bcd
表1的预期输出
ID Name1 Address Counter
1 nm1 abc 1
1 nm2 def 1
1 nm3 ghi 1
0 nm4 jkl 2
0 nm5 mno 2
0 nm6 pqr 2
1 nm7 stu 3
1 nm8 vwx 3
1 nm9 yza 3
0 nm10 bcd 4
订单必须使用关键字段进行排序,并且需要在预期输出中生成自动增量no。
提前致谢。
您需要知道行的顺序。 我想这是示例数据,在您的实际场景中,您可以采用独特的方式对数据进行排序。 对于您的样本数据,我正在使用以下语句对行进行排序:
CAST(REPLACE([Name], 'nm', '') AS INT)
有不同的解决方案(也取决于您的SQL版本)。 如果您使用的是SQL Server 2012+
,则可以使用LAG
函数查找上一行和当前行的ID
值是否已更改,然后使用OVER
子句将这些更改求和:
DECLARE @DataSource TABLE
(
[ID] INT
,[Name] VARCHAR(12)
,[Address] VARCHAR(12)
);
INSERT INTO @DataSource ([ID], [Name], [Address])
VALUES (1, 'nm1', 'abc')
,(1, 'nm2', 'def')
,(1, 'nm3', 'ghi')
,(0, 'nm4', 'jkl')
,(0, 'nm5', 'mno')
,(0, 'nm6', 'pqr')
,(1, 'nm7', 'stu')
,(1, 'nm8', 'vwx')
,(1, 'nm9', 'yza')
,(0, 'nm10', 'bcd');
SELECT *
,SUM([change_made]) OVER (ORDER BY CAST(REPLACE([Name], 'nm', '') AS INT))
FROM
(
SELECT *
,IIF([ID] <> LAG([ID], 1, -1) OVER (ORDER BY CAST(REPLACE([Name], 'nm', '') AS INT)), 1, 0) AS [change_made]
FROM @DataSource
) DS
ORDER BY CAST(REPLACE([Name], 'nm', '') AS INT);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.