在SQL中删除所有重复行

3

我有这样一张表:

|-------------------------|
|   A   |   B   |    C    |
|-------------------------|
|   1   |   2   |    5    |
|-------------------------|
|   1   |   2   |    10   |
|-------------------------|
|   1   |   2   |    2    |
|-------------------------|

我需要删除所有重复的行,这些行具有相等的 A 和 B 值以及较低的 C 值。

运行 SQL 脚本后,我需要每个相等的 A 和 B 列中具有最高 C 值的行。

|-------------------------|
|   A   |   B   |    V    |
|-------------------------|
|   1   |   2   |    10   |
|-------------------------|

https://dev59.com/8WUp5IYBdhLWcg3w6qyq - xQbert
请在您的问题中标记您正在使用的数据库。 - Gordon Linoff
1个回答

3

其中一种方法是窗口函数:

select t.*
from (select t.*, 
             row_number() over (partition by a, b order by v desc) as seqnum
      from t
     ) t
where seqnum = 1;

这会返回整行数据,如果您需要其他列的数据,则非常方便。如果您仅需要这三列数据,那么聚合操作可以达到您的需求:

select a, b, max(v)
from t
group by a, b;

在标准SQL中,您可以使用以下语句仅保留最大值:
delete from t
    where t.v < (select max(t2.v) from t t2 where t2.a = t.a and t2.b = t.b);

1
好的,使用第二个脚本我可以找到最大值,但是如何删除所有较低的行呢? - Svetoslav Panteleev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接