SQL - 如何更新列,每行值递增 1?

问题描述 投票:0回答:6

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

客户 ID 现在为 NULL 更新客户 ID,每行递增 1(即第一行 = 1,第二行 = 2,.....第 n 行 = 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
6个回答
3
投票

示例:假设我想为表

SomeIntField
 中第 
tblUser

列中的每个值添加一个值

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

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

update tblUser set SomeIntField = SomeIntField + 1

第二个:这会添加一个递增值,第一行获得+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 

1
投票

不要使用自引用变量,而是使用 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

1
投票

第一个问题:

您想要将特定列中每一行的值增加 1(或其他数字),请尝试以下操作:

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*

仅供参考:

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


1
投票

用行号更新每一行

尝试以下

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

1
投票

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

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

0
投票

这是一个很老的问题,但我有类似的需求;为每一行创建一个递增值,但是我无法添加列并更新它,这些都不能解决问题。

我拥有的数据:id、图像文件名、创建日期。我需要创建一个带有递增引用的 URL,该引用不保存在数据库中,而是一个数字序列。

我声明起始值,然后添加行号

DECLARE @seq INT = 2425;--one less than needed
SELECT [Order]=@seq+ROW_NUMBER() OVER (ORDER BY [createDate] ASC), [URL]='<img style="width: 600px; height: 400px;" src="/media/'+(CAST (@seq+ROW_NUMBER() OVER (ORDER BY createDate ASC) AS NVARCHAR))+'/'+[text]+'?width=600&amp;height=400" alt="" rel="'+CAST([id] AS NVARCHAR)+'" data-id="'+CAST([id] AS NVARCHAR)+'" />' FROM [data] WHERE [createDate]>'2024-09-28 00:29:00'

script results

© www.soinside.com 2019 - 2024. All rights reserved.