在“查找SQL表”列中的重复值时,将COUNT列增加1

时间:2013-01-19 06:57:18

标签: sql-server duplicates auto-increment

在浏览sql列时,如果我们找到重复值,那么我们需要递增以1开头的计数。

与“Filenum”列中找到的原始值相匹配的任何值。

输出应该如下所示。

-------------------------------
| FILENUM coulmn | num column | 
| a              |          1 |
| a              |          2 |
| a              |          3 |
| b              |          1 |
| b              |          2 |
| c              |          1 |
| d              |          1 |
| a              |          4 |
| b              |          3 | 
-------------------------------

你可以建议的任何解决方案......如果可以避免像row_number()这样的功能,那就更好了。谢谢你好

2 个答案:

答案 0 :(得分:1)

您可以使用序列表来获取每个副本的递增数字。序列表有一个字段,其递增的数字可达到您认为需要的最大值。

我通常会创建一个包含一百万行的序列表供一般使用,在您的情况下,您只需要与重复行一样多的行;对于这个例子,我们只需添加100行:

CREATE TABLE dbo.Sequence
(
    seq_nbr INT NOT NULL,
    CONSTRAINT PK$Sequence
        PRIMARY KEY CLUSTERED (seq_nbr)
        WITH FILLFACTOR = 100,
    CONSTRAINT Sequence$seq_nbr$positive CHECK (seq_nbr > 0)
)
GO
INSERT INTO dbo.Sequence (seq_nbr)
SELECT ten * 10 + unit + 1
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS Units(unit)
     CROSS JOIN
     (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS Tens(ten)

使用序列表将您与表交叉连接以获取重复的计数器:

SELECT  letter
       ,seq_nbr 
FROM    dbo.Sequence
       ,dbo.Duplicates
GROUP BY letter
       ,seq_nbr 
HAVING  seq_nbr <= COUNT(letter)

给出结果:

letter seq_nbr 
------ -------
a            1
a            2
a            3
a            4
b            1
b            2
b            3
c            1
d            1

这是显示结果的SQL Fiddle

答案 1 :(得分:0)

鉴于您不想在SQL Server中使用Row_Number()Dense_Rank(),那么您可能需要

  • 将当前数据拉入带有自动增量的临时表

  • 然后从那里获得每个值的运行总计

否则可以将其操作到SQL服务器中:

set @rno:=0; set @names:='';
select @rno:=case when @names<>names then  1
else @rno+1 end as rno, @names:=names as names
from demo order by names;

预期产出:

rno   names
1       a             -- '' <> a , rno = 1
2       a             -- a = a, rno = 1 + 1 so on...
3       a
4       a
1       b
2       b
1       c
1       d

尝试使用SQLFIDDLE,它可以工作:)