簡體   English   中英

刪除SQL中的相似列

[英]Deleting similar columns in SQL

在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

我覺得自己已經接近了,但是似乎無法繞過一個查詢以消除重復的列。

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]
);

使用EXISTS SQL運算符,答案比Asaph的答案略簡單:

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。

根據您的要求,在我看來這應該可行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM