【问题标题】:SQL - how to update a column with each row value incremented by 1?SQL - 如何更新每行值加 1 的列?
【发布时间】:2018-05-22 12:54:55
【问题描述】:

对于一列中选中的行,如何从头到尾依次更新每一行,每行值加1(或某个数)。我知道这可以在几秒钟内在 excel 中完成,但我可以弄清楚如何在 SQL Server 中实现。例如:

客户 ID 现在为 NULL 更新客户 ID,每行加 1(即第一行 = 1,第二行 = 2,.....nth 行 = n)

ship-to party   customer id 
0002018092      NULL
0002008127      NULL
0002000129      NULL
0002031592      NULL
0002034232      NULL

想要的输出

ship-to party   customer id
0002018092      1
0002008127      2
0002000129      3
0002031592      4
0002034232      5

另外,对于一列中选定的行,如何用行号更新每一行?我知道有一个 row_number() 函数,但没有成功产生所需的结果。比如

A 列现在为 NULL 更新A列,每行加1(即第一行=行号1,第二行=行号2,.....第n行=行号n)

任何演示都会很有帮助。thkans

【问题讨论】:

  • 您确实意识到将行号更新到每一行很大程度上取决于所使用的顺序。如果您不指定顺序,则无法保证将行号放入您期望的行中

标签: sql sql-server loops auto-increment row-number


【解决方案1】:

示例:假设我想为表 tblUser 中的列 SomeIntField 中的每个值添加一个值

有两种方法可以轻松做到这一点

首先:这只是将值 1 添加到每列 SomeIntField

update tblUser set SomeIntField = SomeIntField + 1

second : 这增加了一个递增值,第一行得到 +1,第二行得到 +2,依此类推......

declare @number int = 0

update tblUser
set    @number = @number + 1,    
       SomeIntField = isnull(SomeIntField, 0) + @Number

编辑:根据您最后的评论,这可能是您想要的

declare @table table (shiptoparty varchar(50), customer_id int)

insert into @Table (shiptoparty, customer_id)
values ('0002018092', NULL), ('0002008127', NULL), ('0002000129', NULL), ('0002031592', NULL), ('0002034232', NULL)

declare @number int = 0

update @table
set    @number = @number + 1,    
       customer_id = isnull(customer_id, 0) + @Number

select * from @table

这样的结果是:

shiptoparty | customer_id   
----------- | -----------   
0002018092  | 1 
0002008127  | 2 
0002000129  | 3 
0002031592  | 4 
0002034232  | 5 

【讨论】:

  • 第二个没有给我想要的结果。运行查询代码后,我的列仍然为空。
  • 如果你给我一些示例数据和表格布局,我可以帮助你。从你的问题中不清楚你到底想要什么
  • 同时添加您想要的结果,以便我们确切知道您想要什么
  • 我编辑了第二个解决方案,尚未测试。试试看吧
  • 没有样本数据(你仍然没有提供任何数据)我只能猜测你想要什么
【解决方案2】:

不要使用自引用变量,而是使用 CTE:

WITH CTE AS (
    SELECT [Your Incrementing Column],
           ROW_NUMBER() OVER (ORDER BY [Columns to Order By]) AS RN
    FROM YourTable)
UPDATE CTE
SET [Your Incrementing Column] = RN;

编辑:证明 ALL 行将被更新:

CREATE TABLE #Sample (String varchar(50),
                      IncrementingInt int);

INSERT INTO #Sample (String)
VALUES ('sdkfjasdf'),
       ('dfydsfdfg'), 
       ('sdfgsdfg45yfg'),
       ('dfgf54d'),
       ('dsft43tdc'),
       ('f6gytrntrfu7m45'),
       ('5d6f45wgby54'),
       ('g34h636j'),
       ('jw'),
       ('h6nw54m'),
       ('g54j747jm5e5f4w5gsft'),
       ('ns67mw54mk8o7hr'),
       ('h45j4w5h4');

SELECT *
FROM #Sample;

WITH CTE AS(
    SELECT IncrementingInt,
           ROW_NUMBER() OVER (ORDER BY String) AS RN
    FROM #Sample)
UPDATE CTE
SET IncrementingInt = RN;

SELECT *
FROM #Sample;

DROP TABLE #Sample;
GO

【讨论】:

  • 我认为这不会给第一行增加值
  • ?显然你没有尝试过。 ;) ROW_NUMBER() 永远不会返回 NULL。如果某些记录没有被赋值,那是因为您在CTEUPDATE 中过滤了结果。
  • 您正在覆盖 IncrementingInt 列中的值,如果该列中已经存在值怎么办?我不确定 OP 是否想要一个用值填充的空列或用现有值增加一个列。您的解决方案非常适合第一种情况,但不适用于第二种情况。这就是我的意思
  • @GuidoG 这就是为什么我们需要 DDL、样本数据和预期结果(以及为什么我赞成 Jibin 对这个问题的评论 :))。
  • 对此我完全同意
【解决方案3】:

用行号更新每一行

下面试试

CREATE TABLE tmp(Id INT IDENTITY(1,1), Value INT)

INSERT INTO tmp(value) VALUES(1),(2),(3),(4),(5)

UPDATE T
SET
T.Value = B.RowNo
FROM tmp AS T 
INNER JOIN (SELECT Id, ROW_NUMBER()OVER(ORDER BY Id) AS RowNo FROM tmp)AS B
ON T.Id = B.Id

【讨论】:

    【解决方案4】:

    不要想得很复杂。试试下面给出的简单方法

    alter table table_name drop column customer_id
    go
    alter table table_name add id customer_id IDENTITY(1,1)
    go
    

    【讨论】:

      【解决方案5】:

      第一个问题:

      您想将特定列中每一行的值增加 1(或其他 nuber),试试这个:

      update TABLE_NAME set column_to_increase = column_to_increase + 1
      

      第二个问题:

      您只想获取特定行的行号。解决方案:首先创建包含所有行号的列,然后获取行:

      select * from (
          select column1, column2, ..., columnN, row_number() over (order by (select null)) as [rn] from MY_TABLE
      ) where *condition*
      

      仅供参考:over 子句中的select null 完全没有任何作用,它就在那里,因为窗口函数(例如row_number)必须有over 子句,其中一些需要order by

      【讨论】:

      • 第一个没有给我想要的结果。运行查询代码后,我的列仍然为空。
      • 你没有提到。 null 增加后的值应该是多少?它应该被视为零,所以更新后是一?
      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多