Как удалить самое высокое значение в группе - PullRequest
5 голосов
/ 08 апреля 2011

Я пытаюсь удалить наибольшее значение из группы. Учитывая эти данные:

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 Ответ

6 голосов
/ 08 апреля 2011

У вас есть какой-нибудь первичный ключ в вашей таблице?Согласно вашей спецификации, вы этого не сделаете.

В этом случае:

DELETE 
  FROM group_table 
  WHERE (group_id, st_area) 
    IN (SELECT group_id, MAX(st_area) FROM group_table GROUP BY group_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;

);

Таким образом, вы выбираете максимальный идентификатор для каждого максимального st_area дляid каждой группы.

В случае, если у вас есть такая структура:

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

, первый запрос удалит строки 1 и 3, а второй запрос только 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...