mysql - SQL查询删除

标签 mysql sql database

考虑下表

id  || C1  || C2  || C3 || Timestamp
--------------------------------
1   || a   || b   || 1  || t1
2   || a   || b   || 1  || t2
3   || a   || b   || 2  || t3
4   || a   || b   || 2  || t4
5   || a   || b   || 2  || t5
6   || b   || d   || 3  || t6
7   || b   || d   || 3  || t7

C3 包含给定的 C1 和 C2 组合的不同值。 C1、C2 和 C3 的给定组合可以包含具有不同时间戳的多行(如行 4,5)。

但是,重复会导致为给定的 C1 和 C2 对创建多个 C3。因此,这里第 3、4 和 5 行违反了规则,因为引入了新的 C3(2)。给定 C1 和 C2,C3 始终是唯一的。

我想保留 C1、C2、C3 的最新(带时间戳)组合并删除所有旧的组合。因此仅应存在第 3,4,5 行,并应删除第 1,2 行。
我所说的“最新”是指应删除给定 C1、C2 的旧 C3 值,因此在本例中,第 1,2 行被删除,但第 3、4、5 行保留。

enter image description here

例如,给定唯一的 nid 和原始列,所有带有mock_id YR 的行都应该被删除。

我尝试了各种查询和联接,但无法找出可以解决这个问题的方法。

最佳答案

我们可以尝试在这里使用存在逻辑:

DELETE
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.C1 = t1.C1 AND t2.C2 = t1.C2 AND t2.C3 > t1.C3);

用简单的英语来说,此查询表示删除任何我们可以找到具有相同 C1 的记录。和C2值,但更大 C3值(value)。如果存在这样的另一条记录,则意味着当前正在检查的记录不是最新的,应删除。

关于mysql - SQL查询删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59152257/

相关文章:

mysql - 这个 SELECT 查询有什么问题?

mysql - 删除重复项,但更改值后不删除

mysql - 如何在 RedHat Linux 8 中安装 R 和 RMySQL?

php - 字符串分钟数中缺少零

mysql - SQL错误(1415): Not allowed to return a result set from a function

SQL外部表列长度问题

sql - Hive Query : Trying to string match using WHERE, LIKE on map<string, string>

database - phpMyadmin 给出 token 不匹配错误

mysql - 为什么操作数应该只包含一列?

database - PostgreSQL 中密码的数据类型是什么?