我正在尝试删除组中的最高值.鉴于此数据:
group_table
group_id | st_area
---------------
1 | 20
1 | 30
2 | 1
2 | 1
2 | 200
Run Code Online (Sandbox Code Playgroud)
我想删除第二行和第五行.我知道如何从每组中选择最高的:
SELECT max(area) FROM group_table GROUP BY group_id
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何制定一个将接受它作为子查询的删除语句.当我尝试delete from group_table where st_area = max(st_area);
我收到一个错误:aggregates not allowed in WHERE clause.
我在SO上很快学到的一点是,我不是一个非常好的沟通者.如果我问的不清楚你感到有耐心,我当然会试着澄清一下.
谢谢!
你的桌子上有一些主键吗?根据您的规范,您没有.
在这种情况下:
DELETE
FROM group_table
WHERE (group_id, st_area)
IN (SELECT group_id, MAX(st_area) FROM group_table GROUP BY group_id);
Run Code Online (Sandbox Code Playgroud)
但是如果你有两个最大值行,它将删除两者.
如果在这种情况下您只想删除一个,则应为选择添加一个id列:
DELETE
FROM group_table
WHERE (id)
IN (
SELECT MAX(id) FROM group_table
WHERE (group_id, st_area)
IN ( SELECT group_id, MAX(st_area)
FROM group_table
GROUP BY group_id)
GROUP BY group_id;
Run Code Online (Sandbox Code Playgroud)
);
因此,您为每个组ID选择每个最大st_area的最大ID.
如果您有这样的结构:
id | gid | area
1 1 2
2 1 1
3 1 2
Run Code Online (Sandbox Code Playgroud)
第一个查询将删除第1行和第3行,第二个查询只删除3.