2011-04-07 26 views
5

Estoy intentando eliminar el valor más alto de un grupo. Teniendo en cuenta estos datos:Cómo eliminar el valor más alto en un grupo

group_table

group_id | st_area 
--------------- 
1  | 20 
1  | 30 
2  | 1 
2  | 1 
2  | 200 

me gustaría eliminar la segunda y quinta filas. Yo sé cómo seleccionar el más alto de cada grupo:

SELECT max(area) FROM group_table GROUP BY group_id 

no puedo encontrar la manera de formular una instrucción de eliminación que aceptar eso como una sub consulta, sin embargo. Cuando intento delete from group_table where st_area = max(st_area);

Me sale un error: aggregates not allowed in WHERE clause.

Una cosa que he aprendido bastante rápido en SO es que no soy un comunicador terriblemente bueno. Si lo que estoy pidiendo no está claro & te sientes paciente, ciertamente intentaré aclararlo.

Gracias!

+2

¿tiene una clave principal? Si no, ¿qué desea hacer si hay dos filas MAX (por ejemplo, en su ejemplo, (1,30) está duplicado) – Dutow

+1

No, no tengo una clave principal, pero es una tabla temporal y estoy susceptible de agregar uno. Sin embargo, la columna st_area va a ser bastante aproximada, ya que es un cálculo de área de algunos grados decimales. Tiene 10 dígitos de largo. :) – canisrufus

Respuesta

6

¿Tiene alguna clave principal en su tabla? De acuerdo con su especificación, no lo hace.

En este caso:

DELETE 
    FROM group_table 
    WHERE (group_id, st_area) 
    IN (SELECT group_id, MAX(st_area) FROM group_table GROUP BY group_id); 

Pero si tiene dos filas de máxima de valor, se eliminará tanto.

Si en este caso se quiere eliminar sólo una, se debe añadir una columna de ID para la selección:

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; 

);

Así que está seleccionando la identificación máxima para cada st_area máxima para cada ID de grupo.

En caso de que tenga una estructura como esta:

id | gid | area 
1 1  2 
2 1  1 
3 1  2 

la primera consulta se eliminarán las filas 1 y 3, y la segunda consulta acaba 3.

+0

Su primer ejemplo funciona como un encanto para mí. Gracias. Sin embargo, estoy confundido acerca de su segundo ejemplo. No veo ninguna referencia a st_area, por lo que no estoy seguro de cómo va a eliminar el valor más alto? – canisrufus

+1

mi culpa, edité mi respuesta – Dutow

+0

Gracias. Las obras se hinchan. – canisrufus

Cuestiones relacionadas