1

在遍历 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() 之类的功能会更好..谢谢 adv

4

2 回答 2

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 。

于 2013-11-25T12:08:53.597 回答
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 上试用过,它可以工作:)

于 2013-01-19T09:11:42.427 回答