【问题标题】:On Finding duplicate values in column of SQL Table, Increment a COUNT column by 1在 SQL 表的列中查找重复值时,将 COUNT 列增加 1
【发布时间】:2013-01-19 06:57:18
【问题描述】:

在遍历 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

【问题讨论】:

  • 没有更多信息,例如ID(身份)您将无法更新重复项。
  • 我知道一个使用 Row_number 的解决方案..但是将在 SQL Server2005 之后工作...... SELECT FILENUM, num = ROW_NUMBER() OVER (PARTITION BY FILENUM Order By FILENUM) FROM table1
  • @Haimanta 但他想避开ROW_NUMBER()
  • 这需要在哪些版本的 SQL Server 中工作?

标签: sql-server duplicates auto-increment


【解决方案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

【讨论】:

    【解决方案2】:

    鉴于您不想在 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 上试用过,它可以工作 :)

    【讨论】:

    • @haimanta 请看一下这个查询。您可以尝试在 SQL Server 中实现逻辑,如果可行,请发表评论 =)
    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2015-05-23
    • 2019-06-12
    • 2019-11-10
    • 2020-02-03
    • 2013-06-05
    相关资源
    最近更新 更多