返回除一列中具有重复 ID 的行之外的所有列
Posted
技术标签:
【中文标题】返回除一列中具有重复 ID 的行之外的所有列【英文标题】:Return all columns excluding rows with a duplicateID in one column 【发布时间】:2020-12-29 08:14:51 【问题描述】:我有一个有趣的问题。
我继承了一个草率的数据库,其中包含一个包含重复行的表。但是,由于一列(文本列),它们不是完全重复的。
这是一个例子:
TestID TestDescription Cost
115893hc127aaq Etiology • Understand the causes of acute pancreatitis $10
115893hc127aaq Etiology • Understand the causes of acute pancreatitis $10
115893hc127aaq Etiology • Understand the causes of acute pancreatitis $10
您可以看到除“TestDescription”之外的所有数据都是相同的。
有 1000 行这样的行,其中可能有 2 或 3 行重复的行,在“TestDescription”中存在较小的间距或拼写问题
因此,使用 DISTINCT 将不起作用。
我想选择所有行,但只为每个 TestID 获取一行...让我们说第一行,然后忽略其余行。
我试过 SELECT DISTINCT *
但我无法使用 DISTINCT 执行此操作,因为 TestDescription 包含行之间的细微差异。
SELECT DISTINCT TestID 有效,但只返回 TestID,我需要查看所有列。
有没有办法在 Sql Server 2012 中做到这一点?
谢谢!
【问题讨论】:
【参考方案1】:一种方法使用row_number()
:
select *
from (
select t.*, row_number() over(partition by testid order by (select null)) rn
from mytable t
) t
where rn = 1
这假设您希望每个 testid
有一行,正如您的问题所暗示的那样。
你没有告诉你想用哪一列来打破关系,我不确定是否真的有一个,所以我通过(select null)
oded。这不是一个确定性的order by
子句,因此查询的后续执行可能不会总是从给定的重复组中选择同一行。
【讨论】:
我只关心 TestID 是否不同。在表中,TestDescriptions 在间距方面可能不同,但它们都向看到它的人传达了相同的含义。谢谢! 这几乎有效,但它添加了一个名为“rn”的列。当我尝试使用查询对备份表执行 INSERT 时,我得到一个Column name or number of supplied values does not match table definition.
在执行 INSERT 时有没有办法忽略 'rn' 列?
@SkyeBoniwell:只需将select *
替换为表格的列列表即可。以上是关于返回除一列中具有重复 ID 的行之外的所有列的主要内容,如果未能解决你的问题,请参考以下文章