删除重复的行PostgreSQL

时间:2019-06-21 00:14:26

标签: postgresql duplicates sql-delete

我只想删除具有相同名称的重复行,但我想保留这些行的价值高于其他行。

问题是-当我执行代码时,所有重复的行都将被删除,并且没有人保留。为什么这样?


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行)

1 个答案:

答案 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