【问题标题】:Deleting similar columns in SQL删除 SQL 中的相似列
【发布时间】:2009-11-02 05:39:17
【问题描述】:

在 PostgreSQL 8.3 中,假设我有一个名为 widgets 的表,其中包含以下内容:

 id  | type | count
--------------------
  1  | A    |   21
  2  | A    |   29
  3  | C    |    4
  4  | B    |    1
  5  | C    |    4
  6  | C    |    3
  7  | B    |   14

我想根据type 列删除重复项,只留下表中count 列值最高的那些。最终数据如下所示:

 id  | type | count
--------------------
  2  | A    |   29
  3  | C    |    4  /* `id` for this record might be '5' depending on your query */
  7  | B    |   14

我觉得我很接近了,但我似乎无法围绕一个可以消除重复列的查询。

【问题讨论】:

  • 决胜局怎么样?如果 2+ 个结果具有相同的计数...

标签: sql postgresql delete-row


【解决方案1】:

count 是一个 sql 保留字,因此必须以某种方式对其进行转义。我不记得在我头顶的 Postgres 中执行此操作的语法,所以我只是用方括号括起来(如果不正确,请更改它)。无论如何,理论上应该可以使用以下方法(但我没有实际测试过):

delete from widgets where id not in (
select max(w2.id) from widgets as w2 inner join 
(select max(w1.[count]) as [count], type from widgets as w1 group by w1.type) as sq
on sq.[count]=w2.[count] and sq.type=w2.type group by w2.[count]
);

【讨论】:

  • 谢谢,成功了! :) 我没有使用“count”作为实际的列名,这只是一个愚蠢的例子,它触及了我想要做的事情的核心。感谢您的帮助!
【解决方案2】:

有一个比 Asaph 稍微简单的答案,使用 EXISTS SQL 运算符:

DELETE FROM widgets AS a 
WHERE EXISTS 
  (SELECT * FROM widgets AS b 
   WHERE (a.type = b.type AND b.count > a.count) 
          OR (b.id > a.id AND a.type = b.type AND b.count = a.count))

如果以下 SQL 语句返回至少一条记录,则 EXISTS 运算符返回 TRUE。

【讨论】:

    【解决方案3】:

    根据您的要求,在我看来这应该可行:

    DELETE 
    FROM widgets
    WHERE type NOT IN 
    (
        SELECT type, MAX(count) 
        FROM widgets 
        GROUP BY type
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2014-11-29
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多