Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何添加一个新列,该列根据SQL Server中另一列的值标记一个列的重复?_Sql Server_Duplicates - Fatal编程技术网

Sql server 如何添加一个新列,该列根据SQL Server中另一列的值标记一个列的重复?

Sql server 如何添加一个新列,该列根据SQL Server中另一列的值标记一个列的重复?,sql-server,duplicates,Sql Server,Duplicates,我正试图通过添加一列来修改一个表,该列可以根据Track\u Num标记所有重复的Runner\u Name。我尝试使用: SELECT [Track_Num], ROW_NUMBER() OVER (PARTITION BY [Track_Num] ORDER BY [Runner_Name]) - 1 As Dup, [Runner_Name] FROM [runner] 但它不起作用,它只是对Runner\u Name 表runner如下所示: Track

我正试图通过添加一列来修改一个表,该列可以根据
Track\u Num
标记所有重复的
Runner\u Name
。我尝试使用:

SELECT [Track_Num],
       ROW_NUMBER() OVER (PARTITION BY [Track_Num] ORDER BY [Runner_Name]) - 1 As Dup,
       [Runner_Name]
  FROM [runner]
但它不起作用,它只是对
Runner\u Name

runner
如下所示:

Track_Num     Runner_Name
   1            John
   1            John
   1            Jack
   2            Amy
   2            Mary
   2            John
   3            Josh
   3            Josh
   3            Taylor
我希望得到的理想表格是:

Track_Num     Runner_Name    Dup
   1            John          1
   1            John          1
   1            Jack          NULL
   2            Amy           NULL
   2            Mary          NULL
   2            John          NULL
   3            Josh          1
   3            Josh          1
   3            Taylor        NULL

如果我没有重复你的问题,那么试试这个

select [Track_Num],
       [Runner_Name],
       Case when Count(1) > 1 then 1 else null end as Dup
from runner
group by [Track_num], [Runner_Name]

使用
通用表表达式
识别重复的跑步者:

With cte_dups
As
(
    Select 
        r.Track_Num
        , r.Runner_Name
        , Count(*) As Track_Runner_Count
    From dbo.Runner As r
    Group By 
        r.Track_Num
        , r.Runner_Name
)
Select 
    r.Track_Num
    , r.Runner_Name
    , Iif(c.Track_Runner_Count > 1, 1, Null)
From dbo.Runner As r
    Left Outer Join cte_dups As c
        On c.Track_Num = r.Track_Num
        And c.Runner_Name = r.Runner_Name

首先
按曲目编号、跑步者名称分组,以获得每个组合的计数,然后加入表格:

select 
  r.Track_Num, 
  r.Runner_Name,
  case 
    when g.counter > 1 then 1
    else null
  end Dup 
from runner r inner join ( 
  select Track_Num, Runner_Name, Count(*) counter
  from runner
  group by Track_Num, Runner_Name
) g on g.Track_Num = r.Track_Num and g.Runner_Name = r.Runner_Name

也许只需将窗口函数包装成
符号(nullif(…,1))

示例

Select *
      ,Dup = sign(NullIf(sum(1) over (partition by  [Track_Num],[Runner_Name] ) ,1))
 From [runner]
返回

Track_Num   Runner_Name Dup
1   Jack    NULL
1   John    1
1   John    1
2   Amy     NULL
2   John    NULL
2   Mary    NULL
3   Josh    1
3   Josh    1
3   Taylor  NULL

为什么没有第五个选择呢

SELECT *, dup=(select 1 from runner 
               where track_num=r.track_num and runner_name=r.runner_name 
               having count(*)>1)
FROM runner r
这种方法不需要任何窗口函数或公共表表达式

请参见此处的演示:


下面是一个演示,其中包含null值-它们未被标记为重复值:

dup中的值是什么?是否只有1和null?这是一个很好的问题-样本数据和预期结果作为文本,以及对问题的一个漂亮、简单、清晰的描述。John,我可以
更改表[runner]将dup添加为符号(NullIf)吗(通过[Track_Num]、[Runner_Name]进行分割的总和(1),1))
?@JohnCappelletti@cheklapkok不可以。窗口函数只能存在于select中。可能是一个视图,甚至是一个表值函数。我将创建另一个表。最后一个问题是,如果我在
Runner\u Name
中有空值,它将创建
1
,因为它将为同一
轨迹处理所有空值_Num
相同。谢谢您,先生。@cheklapkok每个音轨一个null不会被标记为dupe。多个null的跑步者名称将是dupe@cheklapkok一定要注意IsNull([runner_Name],newid())如果我在
Runner\u Name
中有
NULL
该怎么办?代码将识别所有
NULL
具有相同
Track\u Num
NULL
以及重复项,对吗?
NULL
不能与任何其他值进行比较,甚至不能与自身进行比较,因此,Runner\u Name中的
NULL
值将永远不会与我的版本。如果您希望
null
值显示为重复值,我们必须使用一些
coalesce()
函数将它们转换为“真实”值…很好,我会尝试一下。谢谢