【问题标题】:Return all columns excluding rows with a duplicateID in one column返回除一列中具有重复 ID 的行之外的所有列
【发布时间】: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 中做到这一点?

谢谢!

【问题讨论】:

    标签: sql-server tsql sql-server-2012 duplicates greatest-n-per-group


    【解决方案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 * 替换为表格的列列表即可。
    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 2013-03-23
    • 2012-10-03
    • 2022-01-16
    • 1970-01-01
    • 2020-07-22
    • 2020-03-11
    • 2017-10-29
    相关资源
    最近更新 更多