当前位置:数据库 > Postgres >>

Postgres去除表中重复数据行

Postgres去除表中重复数据行
 
采用PostgreSQL 9.2 官方文档例子为例:
 
1
CREATE TABLE weather (
2
city      varchar(80),
3
temp_lo   int,          -- low temperature
4
temp_hi   int,          -- high temperature
5
prcp      real,         -- precipitation
6
date      date
7
);
1
INSERT INTO weather VALUES
2
('San Francisco', 46, 50, 0.25, '1994-11-27'),
3
('San Francisco', 43, 57, 0, '1994-11-29'),
4
('Hayward', 37, 54, NULL, '1994-11-29'),
5
('Hayward', 37, 54, NULL, '1994-11-29');   --- duplicated row

 

这里有3中方法:
 
第一种:替换法
 
1
-- 剔除重复行的数据转存到新表weather_temp
2
SELECT DISTINCT city, temp_lo, temp_hi, prcp, date
3
INTO weather_temp
4
FROM weather;
5
-- 删除原表
6
DROP TABLE weather;
7
-- 将新表重命名为weather
8
ALTER TABLE weather_temp RENAME TO weather;
或者

1
-- 创建与weather一样的表weather_temp
2
CREATE TABLE weather_temp (LIKE weather INCLUDING CONSTRAINTS);
3
-- 用剔除重复行的数据填充到weather_temp中
4
INSERT INTO weather_temp SELECT DISTINCT * FROM weather;
5
-- 删除原表
6
DROP TABLE weather;
7
-- 将新重命名为weather.
8
ALTER TABLE weather_temp RENAME TO weather;

 

通俗易懂,有很多毁灭性的操作如DROP,而且当数据量大时,耗时耗空间。不推荐。
第二种: 添加字段法
01
-- 添加一个新字段,类型为serial
02
ALTER TABLE weather ADD COLUMN id SERIAL;
03
-- 删除重复行
04
DELETE FROM weather WHERE id
05
NOT IN (
06
SELECT max(id)
07
FROM weather
08
GROUP BY city, temp_lo, temp_hi, prcp, date
09
);
10
-- 删除添加的字段
11
ALTER TABLE weather DROP COLUMN id;

 

需要添加字段,「暂时不知道Postgres是如何处理添加字段的,是直接在原表追加呢,还是复制原表组成新表呢?」,如果是原表追加,可能就会因为新字段的加入而导致分页(一般block: 8k),如果是复制的话那就罪过了。不好。
 
第三种:系统字段[查看 System Columns]
 
1
DELETE FROM weather
2
WHERE ctid
3
NOT IN (
4
SELECT max(ctid)
5
FROM weather
6
GROUP BY city, temp_lo, temp_hi, prcp, date
7
);

 

针对性强[Postgres独有],但是简单。
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,