如果您想为每个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 可以解决关联问题,以防有超过 1 行具有相同的最大值 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 与rowid 不同的行,每个z 的最大值为a(如果有联系,则为最大值b):
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))
);