Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL中压缩数字列表_Sql Server_Tsql - Fatal编程技术网

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