Sql server 遇到重复项时追加其他列中的值
在这种情况下,我有一组重复记录,对于集合中的每一个其他重复记录,我希望通过追加表中其他列的值使其唯一 请参见以下预期输出:Sql server 遇到重复项时追加其他列中的值,sql-server,tsql,duplicates,Sql Server,Tsql,Duplicates,在这种情况下,我有一组重复记录,对于集合中的每一个其他重复记录,我希望通过追加表中其他列的值使其唯一 请参见以下预期输出: Column1 Column2 NewUniqueColumn ABC A ABC BCD B BCD EFG D EFG DEE E DEE ABC Z ABC-Z EFG X EFG-X 我
Column1 Column2 NewUniqueColumn
ABC A ABC
BCD B BCD
EFG D EFG
DEE E DEE
ABC Z ABC-Z
EFG X EFG-X
我知道一个可能的解决方案是使用下面的GROUPBY子句的case语句
select
case when column 1 in
(select column1 from sampletable group by column1 having count(*) > 1)
then column1 +'-'+column2
else column1 end as NewUniqueColumn
from sampletable
然而,我希望通过编写更少的代码,比如
select column1+ column2 over (partition by column1 order by column1 ) from sampletable
但是我无法确定我应该为column1+column2使用哪个函数,实际上我建议不要在当前表中使用任何DML。它已经具备了区分每个“重复项”所需的所有信息。只需使用
行编号
:
SELECT
column1,
column2,
column1 + '-' + CONVERT(varchar(10),
ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2)) AS NewUniqueColumn
FROM sampletable;
我建议这样做是因为当给定的column1
值有两个或多个记录具有相同的column2
值时,您当前的范例再次崩溃
编辑:
如果确实希望逐字查询确切的预期输出,请尝试以下操作:
SELECT
column1,
column2,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) = 1
THEN column1
ELSE column1 + '-' + column2 END AS NewUniqueColumn
FROM sampletable;
添加行号对unique键没有意义,因为它是一个随机整数值,这就是为什么每当遇到重复的行号时,我都要追加第2列值。追加的行号值没有任何随机性。当给定的
column1
值有两个或多个记录具有相同的column2
值时,您关于追加column2
的建议就失效了。@Zee786我还包括了一个查询,以查询您确切的预期输出。但是,我仍然更喜欢我的第一个版本。我认为第二个版本对我适用,我想从column2中附加值而不是行号的原因是因为column2与column1有些关联,并且对用户来说比附加行号更有意义。示例数据最好作为+。请把你的问题包括在内。欲知详情,,