【问题标题】:Delete and keep certain rows based on conditions from table in postgresql根据 postgresql 表中的条件删除并保留某些行
【发布时间】:2021-12-21 07:11:52
【问题描述】:

我有一张这样结构的桌子:

create table content_relations (
    mainConId    Integer not null,
    relatedConId Integer not null,
    similarity   float not null,
    relatedConAddedOn TIMESTAMP WITH TIME ZONE Not null);

现在我想要一个查询,通过它我应该能够在这些条件下从该表中删除行:

delete rows where count of same mainConId exceeds a max limit(say CMax), 
i.e only keep CMax items per mainConId and that too with sorting according to similarity desc
i.e. keep only CMax items which are most similar in this table and remove extraneous  records for every mainConId

所以在运行这个查询之后,我应该在这个表中最多有 n*CMax 行,其中 n 是唯一 mainConId 的数量。

有人可以帮我查询吗?我认为应该可以使用postgres。 感谢您的建议。

【问题讨论】:

  • @komenten 否 对于我自己的项目,我有一个表,其大小可以随 n*n 增加,所以我需要一种方法来控制表中存在的行数
  • 好的。您能否附上您迄今为止尝试过的查询,以及您可能收到的任何错误消息?
  • 不知道如何在查询中表达我的要求,我不是 sql 专家 :)

标签: postgresql psql delete-row


【解决方案1】:

首先你可以试试这个:

WITH list AS
(
SELECT *
     , row_number() OVER (PARTITION BY mainConId ORDER BY similarity DESC) AS row_number
  FROM content_relations 
)
SELECT *
  FROM list AS l
 WHERE row_number <= CMax

然后,如果结果对应于您要保留的行,您可以删除多余的行:

WITH list AS
(
SELECT mainConId
     , similarity
     , row_number() OVER (PARTITION BY mainConId ORDER BY similarity DESC) AS row_number
  FROM content_relations 
)
DELETE FROM content_relations AS cr
 USING list AS l
 WHERE cr.mainConId = l.mainConId
   AND cr.similarity = l.similarity
   AND l.row_number > CMax

【讨论】:

  • 虽然第一部分给出了要保留的正确记录,但删除部分删除了应该保留的错误行,特别是它删除了 row_number > CMax 的 mainConId 的所有记录。理想情况下,我们只需要删除那些扩展限制并保持限制的记录。
  • 好的,我已经更新了删除语句中的WHERE 子句,以便更好地从list cte 中选择要删除的行。
  • 我仍然需要根据您的回答进行一些修改。非常感谢您的帮助
【解决方案2】:

根据@Edouard H. 的回答,我达到了解决点:

WITH list AS
(
SELECT mainConId, relatedConId 
     , row_number() OVER (PARTITION BY mainConId ORDER BY similarity DESC) AS row_number
  FROM content_relations 
)
DELETE FROM content_relations AS cr
 USING list AS l
 WHERE cr.mainConId = l.mainConId
   AND cr.relatedConId = l.relatedConId
   AND l.row_number > CMax;

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 2017-06-08
    • 1970-01-01
    • 2023-01-19
    • 2021-02-04
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多