【问题标题】:Conditional auto increment value in SQL server "SELECT"SQL 服务器“SELECT”中的条件自动增量值
【发布时间】:2018-10-17 08:23:10
【问题描述】:

表 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

Table1 的预期输出

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

订单必须使用关键字段进行排序,并且需要在预期输出中生成自动增量号。

提前致谢。

【问题讨论】:

  • 你需要给我们一个列,它可以可靠地生成我们在当前表中看到的顺序。请注意,Name1 不起作用,因为它将数字混合为文本,并且数字无法正确排序。
  • 什么“关键领域”?

标签: sql sql-server tsql select


【解决方案1】:

您需要知道行的顺序。我想这是示例数据,在您的真实场景中,您可以以独特的方式对数据进行排序。使用您的示例数据,我使用以下语句对行进行排序:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2011-02-05
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2015-12-30
    相关资源
    最近更新 更多