繁体   English   中英

SQL Server“ SELECT”中的条件自动增量值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM