【问题标题】:SQL: Removing Duplicates in one column while retaining the row with highest value in another columnSQL:删除一列中的重复项,同时保留另一列中具有最高值的行
【发布时间】:2016-07-26 23:58:07
【问题描述】:

我正在使用 Teradata 并且一直在尝试编写一些代码...我想根据 ColumnA 中的值删除 columnB 具有重复值的行 - 如果有人可以帮助我,那就太好了!

我在 columnA 中有一个序列号,并希望保留 columnA 中具有最高值的行。 例如。在下表中,我想保留第 9、7、6 和 2 行,因为尽管它们在第 2 列中有重复项,但它们具有该字母的最高 ColumnA 值。

表名:数据表

Column1    Column2     Column3     Column4     Column5

     1           B           X           X           X
     2           A           Y           Y           Y
     3           E           Z           Z           Z
     4           B           X           X           X
     5           C           Y           Y           Y
     6           E           Z           Z           Z
     7           C           X           X           X
     8           B           Y           Y           Y
     9           B           Z           Z           Z

【问题讨论】:

  • 欢迎来到 SO。如果您以与已使用的表格格式相同的表格格式添加预期结果,那就更好了。
  • 你说ColumnA,但表有Column1
  • 好的,谢谢,注意到了。

标签: sql duplicates teradata


【解决方案1】:

如果你只想选择行,你可以这样做:

select t.*
from t
where t.columnA = (select max(t2.columnA) from t t2 where t2.columnB = t.columnB);

如果你真的想删除它们,那么一种方法是:

delete from t
where t.columnA < (select max(t2.columnA) from t t2 where t2.columnB = t.columnB);

【讨论】:

  • 非常感谢 :o)
【解决方案2】:

如果您想使用 SELECT 返回这些行,则不需要关联子查询,OLAP 函数通常执行得更好:

select *
from tab
qualify
  row_number() over (partition by ColumnB order by columnA DESC) = 1

如果你真的想 DELETE 其他行去 Gordon 的查询。

【讨论】:

  • 谢谢,这正是我想要的,它返回第 2,9,7,6 行。
  • 下一步是删除其他行,所以我可能需要使用 Gordon 的查询
  • @Surfing:如果要删除大量行,创建表的空副本可能更有效,插入/选择要保留的行,然后删除/重命名。或者可能保留旧表,直到您 100% 确定您删除了正确的行:-)
  • 我删除了 1600 行,但仍然有源数据上传文件 - 上传完成后没有其他任何变化,所以我有一个备份。再次感谢:)
猜你喜欢
  • 2017-06-09
  • 2018-12-29
  • 2012-09-11
  • 1970-01-01
  • 2014-06-23
  • 2021-07-13
  • 2010-11-29
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多