2009-11-26 2 views
1

С использованием SQL Server 2000 рассмотрите таблицу источников с более чем 400 000 записей.TSQL - генерировать порядковый номер для повторяющихся записей

Задача состоит в том, чтобы выбрать каждую запись regno с приращением на лету rowid или порядковым номером для тех, у кого есть дубликаты или несколько записей. Для тех, у кого нет дубликатов записей в исходной таблице, rowid должен быть просто null.

Вот пример желаемого выхода:

 
    regno rowid 
    100  1 
    100  2 
    100  3 
    200  null 
    300  4 
    300  5 
    400  null 
    500  null 
    600  6 
    600  7 

Вопрос: Что запрос будет делать нужную последовательность увеличивающиеся с помощью TSQL в SQL Server 2000?

+0

Вы имеете в виду INSERT, как вы сказали (в новую таблицу из существующего), или это действительно ОБНОВЛЕНИЕ? – RickNZ

+1

Я думаю, что OP означает UPDATE. Это будет иметь смысл из данных и запроса. –

+0

RANK - единственная функция ранжирования, доступная в 2000 году, о которой я знаю - эта ссылка является лучшим, что я могу найти для генерации rowid, но это не позволит вам пропустить строки: http://support.microsoft.com/kb/186133 –

ответ

0

Запроса для извлечения неуникальных записей будут

select regno,count(*) from table group by regno having count(*) > 1 

Я не знаю достаточно о MSSQL, чтобы сказать вам, как генерировать порядковый номер инкрементации для обновления записей, которые соответствуют запросу.

2

Если мой комментарий является правильным (600 должен быть 6,7), а затем посмотреть на этой

DECLARE @Table TABLE(
     regno INT, 
     rowid INT 
) 

INSERT INTO @Table (regno,rowid) SELECT 100, NULL 
INSERT INTO @Table (regno,rowid) SELECT 100, NULL 
INSERT INTO @Table (regno,rowid) SELECT 100, NULL 
INSERT INTO @Table (regno,rowid) SELECT 200, NULL 
INSERT INTO @Table (regno,rowid) SELECT 300, NULL 
INSERT INTO @Table (regno,rowid) SELECT 300, NULL 
INSERT INTO @Table (regno,rowid) SELECT 400, NULL 
INSERT INTO @Table (regno,rowid) SELECT 500, NULL 
INSERT INTO @Table (regno,rowid) SELECT 600, NULL 
INSERT INTO @Table (regno,rowid) SELECT 600, NULL 

DECLARE @TempTable TABLE(
     ID INT IDENTITY(1,1), 
     regno INT 
) 

INSERT INTO @TempTable (regno) 
SELECT regno 
FROM @Table 

SELECT regno, 
     CASE 
      WHEN (SELECT COUNT(1) FROM @TempTable WHERE regno = t.regno) = 1 
       THEN NULL 
      ELSE (SELECT COUNT(1) FROM @TempTable WHERE regno = t.regno) - (SELECT COUNT(1) FROM @TempTable WHERE regno = t.regno AND ID > t.ID) + 
      (SELECT COUNT(1) FROM @TempTable WHERE regno < t.regno AND regno IN (SELECT regno FROM @TempTable GROUP BY regno having COUNT(1) > 1)) 
     END Val  
FROM @TempTable t 
0

без временной таблицы:

DECLARE @Table TABLE(
     regno INT 
) 

INSERT INTO @Table (regno) SELECT 100 
INSERT INTO @Table (regno) SELECT 100 
INSERT INTO @Table (regno) SELECT 100 
INSERT INTO @Table (regno) SELECT 200 
INSERT INTO @Table (regno) SELECT 300 
INSERT INTO @Table (regno) SELECT 300 
INSERT INTO @Table (regno) SELECT 400 
INSERT INTO @Table (regno) SELECT 500 
INSERT INTO @Table (regno) SELECT 600 
INSERT INTO @Table (regno) SELECT 600 

select regno, null as rowid from @Table group by regno having count(*) = 1 
union 
select regno, row_number() OVER (ORDER BY a.regno) as rowid 
    from @table a 
    where regno in (select regno from @table group by regno having count(*) > 1) 

regno  rowid 
----------- -------------------- 
100   1 
100   2 
100   3 
200   NULL 
300   4 
300   5 
400   NULL 
500   NULL 
600   6 
600   7 

К сожалению, - не видели, что вы хотите для этого в SQL 2000 до тех пор, пока не опубликуйте это ... игнорируйте мой запрос. В SQL 2000 вам нужна временная таблица для генерации последовательности.

Смежные вопросы