TSQL-生成重复记录的序列号

问题描述:

使用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 

问: 什么查询会做在SQL Server 2000中使用T-SQL增加所需的顺序?

+0

你的意思是INSERT如你所说(从一个现有的新表中),还是真的是一个更新? – RickNZ 2009-11-26 05:36:21

+1

我认为OP意味着更新。这从数据和请求中是有意义的。 – 2009-11-26 05:38:17

+0

RANK是2000年唯一可用的排名函数,我知道这个链接是我能找到的用于生成rowid的最佳排名,但它不会允许您跳过行:http://support.microsoft.com/kb/186133 – 2009-11-26 06:15:36

查询,提取非唯一的记录将

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

我不知道有足够的了解MSSQL告诉你如何生成一个递增的序列号来更新匹配查询的记录。

如果我的意见是正确的(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 

没有一个临时表:

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中,您需要一个临时表来生成序列。