我只想删除具有相同名称的重复行,但我想保留这些行的价值高于其他行。
问题是-当我执行代码时,所有重复的行都将被删除,并且没有人保留。为什么这样?
SELECT name from ( select name, ROW_NUMBER() OVER(
PARTITION_BY(name) ORDER BY sum DESC) AS rn FROM table ) t
WHERE t.rn > 1
给了我1400行,但是
DELETE FROM table WHERE name IN
(select company_name from ( select company_name, row_number() over (
partition by(company_name) order by sum_scoring desc) as rn from table ) t
where t.rn > 1)
删除2500行(我想保留1100行)
答案 0 :(得分:0)
正如zerkms所说,您对记录的区分不够。
您只是删除所有具有重复名称的记录,您想删除除一个以外的所有记录。
这需要一个主键或另一个唯一列。
我建议使用rowid(在postgres AFAIK中为ctid)
DELETE FROM table
WHERE ctid IN
(
select row_id_int
from
(
select company_name ctid as row_id_int, row_number() over ( partition by(company_name) order by
sum_scoring desc) as rn
from table
) t
where t.rn > 1
)
资源:
ROWID equivalent in POSTGRES
POSTGRES Documentation, system columns