我在sqlite查询中:
从不存在的测试中删除 ( SELECT * FROM(从 SELECT GROUP BY z SELECT MAX(a)) )一切正常。如果另一行具有相同的“ a”最大值,则问题开始。在这种情况下,不会删除任何行。如何添加另一个条件(子查询)-当两个相同的最大值相同时,b列中的数字确定应删除的行数?
如果你想保持与最大的行a
每个z
并删除其他人,那么你可以使用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
的最大行数不同的所有行a
(b
如果有联系,则删除最大行)z
:
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))
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句