在浏览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()这样的功能,那就更好了。谢谢你好
答案 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,它可以工作:)