2011-04-07 4 views
5

그룹에서 가장 높은 값을 삭제하려고합니다. 이 데이터를 감안할 때 :그룹에서 가장 높은 값을 삭제하는 방법

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을 얻습니다.

내가 매우 빨리 배웠던 한 가지는 내가 끔찍하게 훌륭한 의사 전달자가 아니라는 것입니다. 내가 묻고있는 것이 확실하지 않다면 & 당신은 참을성이있다. 분명히 분명히하려고 노력할 것이다.

감사합니다.

+2

기본 키를 가지고 수행

경우

이 같은 구조를 가지고? 그렇지 않다면 두 개의 MAX 행 (예 : 1,30)이 중복되는 경우 수행 할 작업은 무엇입니까? – Dutow

+1

아니요, 기본 키가 없지만 임시 테이블이므로 하나 추가하기 쉽다. st_area 열은 소수에 가까운 것으로 계산되기 때문에 유일 할 정도로 가깝습니다. 10 자리 길이입니다. :) – canisrufus

답변

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를 선택합니다. 첫 번째 쿼리 행 1과 3을 삭제합니다

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

, 두 번째 질의 단지 3

+0

첫 번째 예제는 나를위한 매력처럼 작동합니다. 고맙습니다. 두 번째 예도 혼란 스럽습니다. st_area에 대한 참조가 보이지 않으므로 가장 높은 값을 제거하는 방법이 확실하지 않습니다. – canisrufus

+1

내 잘못, 내 대답을 편집했습니다 – Dutow

+0

고마워. 부풀어 오릅니다. – canisrufus

관련 문제