sql - 删除所有行,但每组中值最大的行除外

标签 sql postgresql greatest-n-per-group window-functions sql-delete

所以,我最近问了一个问题:Update using a subquery with aggregates and groupby in Postgres
事实证明我在解决问题时逻辑有缺陷。

在上述问题的相同场景中,我不想更新所有行以具有最大数量,而是删除没有最大数量的行(以及任何重复的最大数量)。

本质上,我只需将以下内容转换为删除语句,该语句仅保留每个 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;

最佳答案

由于可能有共享相同最大数量的对等点,因此安全路由是带有 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?

关于sql - 删除所有行,但每组中值最大的行除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210878/

相关文章:

sql - 公式买三送一

php - 我应该使用数据库还是 php 创建哈希

postgresql - Google Cloud SQL - Postgresql 存储不断增长

sql - SQL脚本错误: Only one statement is allowed per batch

java - 调试 hibernate 配置的工具

c - postgres的扩展有什么区别?

sql - 如何从每组中选择前 5%?

mysql - 来自唯一 mysql 索引的最新日期时间

sql - 每组的最小行数

mysql - 选择所有列,同时对一列执行 ifnull