如何删除组中的最高值

时间:2011-04-07 22:36:07

标签: sql postgresql

我正在尝试删除组中的最高值。鉴于此数据:

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上很快就学会了一件事,那就是我不是一个非常好的沟通者。如果我问的不清楚&你感觉很耐心,我当然会试着澄清一下。

谢谢!

1 个答案:

答案 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。