返回除一列中具有重复 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 的行之外的所有列的主要内容,如果未能解决你的问题,请参考以下文章

SQL选择一列中具有重复值的所有行

根据条件对 BigQuery 中的行进行重复数据删除

UDF:对于列中小于 x 的单元格值,返回第一列中的所有值

如何删除R中两列中具有相同值但ID不同的行[重复]

如何使用 MySQL 查询从表中选择除一列之外的所有内容? [复制]

如果有 id 重复,则选择所有行,然后选择具有特定类型的(2 个)