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()
函数将它们转换为“真实”值…很好,我会尝试一下。谢谢