sql - 删除sql中所有重复的行

标签 sql database

我有这样的 table

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

我需要删除所有具有等于 A nad B 值和较低 C 值的重复行

在运行 sql 脚本后,对于每个等于 A 和 B 的列,我只需要具有最高 C 值的这一行

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

最佳答案

一种方法是窗口函数:

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);

关于sql - 删除sql中所有重复的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66154455/

相关文章:

MySql:替换成数字=数字+1

.net - 需要有关大型 .net 数据访问层的建议

mysql - 从孙表中检索记录

java - 使用 JPA 持久性将历史对象映射到项目对象

php - 错误 : Could not make a database connection using user@host

database - 在 Perl 中将整数转换为字符串以进行数据库插入

mysql - 基于日期的动态表名

SQL:和/或与多对多连接匹配

SQL Server Management Studio 2008 - 为什么我的左联接不提供空记录?

mysql - 在第一次 SELECT 查询后从第二个表中获取特定列