Как сжать список чисел в SQL - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица с одним int столбцом. Все числа уникальны, но не все присутствуют в диапазоне от наименьшего (1) до наибольшего. Я хотел бы "сжать" список номеров, чтобы наибольшее число в списке составляло COUNT чисел в списке, и чтобы записи оставались в том же относительном порядке (представьте, что это столбец Identity, нона самом деле это не так). Так что например если у меня есть числа

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?

Ответы [ 4 ]

3 голосов
/ 04 октября 2019

Химаншу был на месте с row_number (), уже +1.

Однако, на случай, если вы хотели выполнить ОБНОВЛЕНИЕ ... это можно сделать с помощью CTE

Пример

;with cte as (
    Select *
          ,NewValue = row_number() over (order by SomeCol)
     from YourTable
)
Update cte set SomeCol=NewValue
3 голосов
/ 04 октября 2019

Полагаю, вам просто нужен row_number ()

    SELECT row_number() 
     over
  (partition by column order by column 
   asc) rn from table;
1 голос
/ 04 октября 2019

Как вы упомянули, что числа уже уникальны, используйте следующие альтернативные методы -

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
0 голосов
/ 04 октября 2019

На заметку. Вы можете думать о 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 для такого типа вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...