sqlite如何添加另一个子查询?

sqlite如何添加另一个子查询?,sqlite,Sqlite,我在sqlite查询中有: DELETE FROM test WHERE a NOT IN ( SELECT * FROM ( SELECT MAX(a) FROM test GROUP BY z ) ) 它工作正常。如果有另一行具有相同的“a”最大值,则问题开始。在这种情况下,不会删除任何行。 如何添加另一个条件子查询-当两个最大值相同时,b列中的数字决定应删除哪一行?如果要保留

我在sqlite查询中有: DELETE FROM test WHERE a NOT IN ( SELECT * FROM ( SELECT MAX(a) FROM test GROUP BY z ) ) 它工作正常。如果有另一行具有相同的“a”最大值,则问题开始。在这种情况下,不会删除任何行。
如何添加另一个条件子查询-当两个最大值相同时,b列中的数字决定应删除哪一行?

如果要保留每个z的最大值为a的行并删除其他行,则可以使用EXISTS:

或使用相关子查询:

DELETE FROM test
WHERE a < (SELECT MAX(t.a) FROM test t WHERE t.z = test.z)
编辑:

如果有另一列b在有多行具有相同的最大值a的情况下解析关系,则还可以使用行号或秩窗口函数:

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与最大值为a和最大值为b的rowid不同的所有行(如果每个z都有关联):


我认为您不能在SQLite上使用WHERE-IN进行此查询。它可能在其他数据库上实现,比如MySQL,它支持元组语法;2线:a=20,b=4,z=ppp;在查询“2行:a=20,b=4,z=ppp”后只剩下一行;问题是当有:1行:a=10,b=5,z=ppp;2行:a=10,b=4,z=ppp;'“a”是相同的,查询后没有删除任何内容,但第2行应该删除。此注释应该在您的问题中,以澄清要求。请看我编辑的答案。谢谢。最后一个代码是有效的,但对于大型数据库来说,这可能需要很多时间吗?我在SQLiteStudio中运行它。编辑后的第一个代码show me near:syntax error我尝试使用sqlitetutorial站点进行更正,该站点关于排名和分区,但没有成功:您可以在这里看到:查询在语法上是正确的。可能您使用的是旧版本的SQLite,它不支持非常高效的窗口函数。如果是这种情况,那么我担心您将不得不使用性能较差的解决方案。在sqlite控制台中,它工作正常且速度非常快。问题是我的SqliteStudio。
DELETE FROM test
WHERE (z, a) NOT IN (SELECT z, MAX(a) FROM test GROUP BY z)
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  
)
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)
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))
);