如果您想保留每个
z
中最大的
a
行并删除其他行,则可以使用
EXISTS
:
DELETE FROM test
WHERE EXISTS (
SELECT 1 FROM test t
WHERE t.z = test.z AND a > test.a
)
或者使用相关的子查询:
DELETE FROM test
WHERE a < (SELECT MAX(t.a) FROM test t WHERE t.z = test.z)
或者使用 ROW VALUES
与运算符 IN
:
DELETE FROM test
WHERE (z, a) NOT IN (SELECT z, MAX(a) FROM test GROUP BY z)
编辑:
如果您有另一个列b
,用于解决存在多个具有相同最大值a
的行的情况,请同时使用ROW_NUMBER()
或RANK()
窗口函数:
DELETE FROM test
WHERE (z, a, b) IN (
SELECT z, a, b
FROM (
SELECT z, a, b, ROW_NUMBER() OVER (PARTITION BY z ORDER BY a DESC, b DESC) rn
FROM test
) t
WHERE rn > 1
)
或者删除所有的行,其rowid
与每个z
的最大a
(如果有并列,则为最大b
)的rowid
不同:
DELETE FROM test
WHERE rowid <> (SELECT t.rowid FROM test t WHERE t.z = test.z ORDER BY t.a DESC, t.b DESC LIMIT 1)
或者使用
EXISTS
:
DELETE FROM test
WHERE EXISTS (
SELECT 1 FROM test t
WHERE (t.z = test.z) AND (t.a > test.a OR (t.a = test.a AND t.b > test.b))
);
WHERE IN
进行此查询。这在其他支持元组语法的数据库(如MySQL)上可能是可行的。 - Tim Biegeleisen