1

Итак, я только недавно задал вопрос: Update using a subquery with aggregates and groupby in Postgres
и, оказывается, я собирался о проблеме с ошибочной логикой.Удалите все строки, кроме одного с наибольшим значением для каждой группы

В том же сценарии в вопросе выше, вместо того, чтобы обновлять все строки с максимальным количеством, я хотел бы удалить строки, которые не имеют максимального количества (и любых дублированных максимальных количеств).

По существу мне нужно просто преобразовать нижеследующее в инструкцию delete, которая сохраняет только самые большие количества в item_name. Я предполагаю, что мне понадобится NOT EXISTS, но я не уверен, как это сделать с помощью агрегатных функций.

UPDATE transaction t 
SET quantity = sub.max_quantity 
FROM (
    SELECT item_name, max(quantity) AS max_quantity 
    FROM transaction 
    GROUP BY 1 
) sub 
WHERE t.item_name = sub.item_name 
AND t.quantity IS DISTINCT FROM sub.max_quantity; 
+0

Да, 'NOT EXISTS()' это путь. Другим способом было бы перечислить кортежи с использованием оконной функции. Обратите внимание, что две строки могут использовать одно и то же значение MAX(). – wildplasser

ответ

2

Поскольку может быть сверстники разделяющие одинаковое максимальное количество, безопасный маршрут подзапрос с window function row_number():

DELETE FROM transaction t 
USING (
    SELECT some_unique_id, row_number() OVER (PARTITION BY item_name 
              ORDER BY quantity DESC) AS rn 
    FROM transaction 
    GROUP BY 1 
    ) sub 
WHERE t.some_unique_id = sub.some_unique_id 
AND sub.rn > 1; 

Где some_unique_id может быть любой уникальный столбец или комбинацию столбцов (отражал в GROUP BY).

Заканчивается быть очень похожи на этот вопрос сегодня:
Delete rows with duplicates on two fields

Если ваша таблица большой и вы собираетесь удалить большую часть этого, рассмотреть современные советы здесь:
How to delete duplicate entries?

+0

Вау, я понятия не имел, что от использования существует! Ты мужчина! – Gus

 Смежные вопросы

  • Нет связанных вопросов^_^