TSQL - сгенерировать порядковый номер для дубликатов записей - PullRequest
1 голос
/ 26 ноября 2009

Используя SQL Server 2000, рассмотрим исходную таблицу с более чем 400 000 записей.

Задача состоит в том, чтобы выбрать каждую запись 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?

Ответы [ 3 ]

2 голосов
/ 26 ноября 2009

Если мой комментарий правильный (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 голосов
/ 06 декабря 2009

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

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 вам понадобится временная таблица для генерации последовательности.

0 голосов
/ 26 ноября 2009

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

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

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

...