[英]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.