如何删除组中的最高值

can*_*fus 5 sql postgresql

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

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上很快学到的一点是,我不是一个非常好的沟通者.如果我问的不清楚你感到有耐心,我当然会试着澄清一下.

谢谢!

Dut*_*tow 6

你的桌子上有一些主键吗?根据您的规范,您没有.

在这种情况下:

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.