Sql server 如何在SQL中压缩数字列表
我有一个表,有一个Sql server 如何在SQL中压缩数字列表,sql-server,tsql,Sql Server,Tsql,我有一个表,有一个int列。这些数字都是唯一的,但并非都在最小(1)到最大的范围内。我想“压缩”数字列表,以便列表中最大的数字是列表中数字的计数,并且记录保持相同的相对顺序(将其视为标识列,但实际上并非如此)。例如,如果我有这些数字 1 3 5 6 10 11 14 15 20 30 我想把它们重新编号 1 2 3 4 5 6 7 8 9 10 当3变为2时,5变为3,等等。如何在T-SQL中做到这一点?我想您只需要行号() 正如您提到的,这些数字已经是唯一的, 使用以下替代方法- IF O
int
列。这些数字都是唯一的,但并非都在最小(1)到最大的范围内。我想“压缩”数字列表,以便列表中最大的数字是列表中数字的计数
,并且记录保持相同的相对顺序(将其视为标识列,但实际上并非如此)。例如,如果我有这些数字
1 3 5 6 10 11 14 15 20 30
我想把它们重新编号
1 2 3 4 5 6 7 8 9 10
当3变为2时,5变为3,等等。如何在T-SQL中做到这一点?我想您只需要行号()
正如您提到的,这些数字已经是唯一的, 使用以下替代方法-
IF OBJECT_ID('TEMPDB..#SampleTable') IS NOT NULL DROP TABLE #SampleTable
Create table #SampleTable (num int)
insert into #SampleTable values (1),(3),(5),(6),(10),(11),(14),(15),(20),(30)
--Alternate Methods
select num,
row_number() over (order by num) as [ROW_NUMBER],
rank() over (order by num) as [RANK],
dense_rank() over (order by num) as [DENSE_RANK]
from #SampleTable
Himanshu的行号()已经是+1了 但是,如果您希望执行更新。。。这可以通过CTE完成 示例
;with cte as (
Select *
,NewValue = row_number() over (order by SomeCol)
from YourTable
)
Update cte set SomeCol=NewValue
旁注。您可以将ROW_NUMBER()视为行的运行总数。您可以看到,它们都做相同的事情:
WITH numbers AS (SELECT f.G, f.N FROM (VALUES (1,1),(1,3),(1,4),(2,1),(2,5)) AS f(G,N))
SELECT
NbrGroup = f.G,
OldNbr = f.N,
NewNbrRN = ROW_NUMBER() OVER (PARTITION BY f.G ORDER BY f.N),
NewNbrC = COUNT(*) OVER (PARTITION BY f.G ORDER BY f.N)
FROM numbers AS f;
结果:
NbrGroup OldNbr NewNbrRN NewNbrC
----------- ----------- -------------------- -----------
1 1 1 1
1 3 2 2
1 4 3 3
2 1 1 1
2 5 2 2
ROW_NUMBER()的性能更好,这就是为什么开发人员不使用COUNT进行这类操作的原因 我没有投反对票,但:
NbrGroup OldNbr NewNbrRN NewNbrC
----------- ----------- -------------------- -----------
1 1 1 1
1 3 2 2
1 4 3 3
2 1 1 1
2 5 2 2