Итак, я только недавно задал вопрос: 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;
Да, 'NOT EXISTS()' это путь. Другим способом было бы перечислить кортежи с использованием оконной функции. Обратите внимание, что две строки могут использовать одно и то же значение MAX(). – wildplasser