对于一列中选中的行,如何从头到尾依次更新每一行,每行值加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
示例:假设我想为表
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
不要使用自引用变量,而是使用 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(或其他数字),请尝试以下操作:
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
。
用行号更新每一行
尝试以下
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
不要想得太复杂。尝试下面给出的简单方法
alter table table_name drop column customer_id
go
alter table table_name add id customer_id IDENTITY(1,1)
go
这是一个很老的问题,但我有类似的需求;为每一行创建一个递增值,但是我无法添加列并更新它,这些都不能解决问题。
我拥有的数据: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&height=400" alt="" rel="'+CAST([id] AS NVARCHAR)+'" data-id="'+CAST([id] AS NVARCHAR)+'" />' FROM [data] WHERE [createDate]>'2024-09-28 00:29:00'