加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Postgres去除表中重复数据行

发布时间:2020-12-13 17:37:13 所属栏目:百科 来源:网络整理
导读:采用PostgreSQL 9.2 官方文档例子为例: CREATE TABLE weather (city varchar(80),temp_lo int,-- low temperaturetemp_hi int,-- high temperatureprcp real,-- precipitationdate date); INSERT INTO weather VALUES('San Francisco',46,50,0.25,'1994-11-

采用PostgreSQL 9.2 官方文档例子为例:

CREATE TABLE weather (
city      varchar(80),temp_lo   int,-- low temperature
temp_hi   int,-- high temperature
prcp      real,-- precipitation
date      date
);
INSERT INTO weather VALUES
('San Francisco',46,50,0.25,'1994-11-27'),('San Francisco',43,57,'1994-11-29'),('Hayward',37,54,NULL,'1994-11-29');   --- duplicated row

这里有3中方法:

第一种:替换法

-- 剔除重复行的数据转存到新表weather_temp
SELECT DISTINCT city,temp_lo,temp_hi,prcp,date 
INTO weather_temp 
FROM weather; 
-- 删除原表
DROP TABLE weather;
-- 将新表重命名为weather
ALTER TABLE weather_temp RENAME TO weather;

或者

-- 创建与weather一样的表weather_temp
CREATE TABLE weather_temp (LIKE weather INCLUDING CONSTRAINTS);
-- 用剔除重复行的数据填充到weather_temp中
INSERT INTO weather_temp SELECT DISTINCT * FROM weather;
-- 删除原表
DROP TABLE weather;
-- 将新重命名为weather.
ALTER TABLE weather_temp RENAME TO weather;
通俗易懂,有很多毁灭性的操作如DROP,而且当数据量大时,耗时耗空间。不推荐。 第二种: 添加字段法
-- 添加一个新字段,类型为serial
ALTER TABLE weather ADD COLUMN id SERIAL;
-- 删除重复行
DELETE FROM weather WHERE id 
NOT IN (
SELECT max(id) 
FROM weather 
GROUP BY city,date
);
-- 删除添加的字段
ALTER TABLE weather DROP COLUMN id;

需要添加字段,「暂时不知道Postgres是如何处理添加字段的,是直接在原表追加呢,还是复制原表组成新表呢?」,如果是原表追加,可能就会因为新字段的加入而导致分页(一般block: 8k),如果是复制的话那就罪过了。不好。

第三种:系统字段[查看System Columns]

DELETE FROM weather 
WHERE ctid 
NOT IN (
SELECT max(ctid) 
FROM weather 
GROUP BY city,date
);

针对性强[Postgres独有],但是简单。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读