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