注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

零售创新,创新那些事儿,SPSS,VBA

零售创新

 
 
 

日志

 
 
关于我

新浪微博,零售创新 研究经理,数据分析师 希望和市场研究和零售业的同事共同进步! 本博客发表的都是免费或试用的资料,如果有版权问题请发邮件wangli12a@163.com联系删除。 spss excel vba blog

网易考拉推荐

PostgreSQL删除重复数据  

2014-04-12 14:03:04|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 PostgreSQL删除重复数据

PostgreSQL删除重复数据 - 和平 - 零售创新,创新那些事儿,SPSS,VBA
 
去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。
 
Oracle 去重的方法很多,常用的是根据 rowid 进行去重。
 
PostgreSQL 库如何去除单表重复数据呢?可以通过 ctid 进行,下面是实验过程。
 

一、创建测试表
 
david=# create table emp (
david(# id int,
david(# name varchar);
CREATE TABLE
david=#
 
二、插入测试数据
 
david=# insert into emp values (1, 'david');
INSERT 0 1
david=# insert into emp values (1, 'david');
INSERT 0 1
david=# insert into emp values (1, 'david');
INSERT 0 1
david=# insert into emp values (2, 'sandy');
INSERT 0 1
david=# insert into emp values (2, 'sandy');
INSERT 0 1
david=# insert into emp values (3, 'renee');
INSERT 0 1
david=# insert into emp values (4, 'jack'); 
INSERT 0 1
david=# insert into emp values (5, 'rose');
INSERT 0 1
david=#
 
三、查询初始化数据
 
david=# select ctid, * from emp;
 ctid  | id | name 
-------+----+-------
 (0,1) |  1 | david
 (0,2) |  1 | david
 (0,3) |  1 | david
 (0,4) |  2 | sandy
 (0,5) |  2 | sandy
 (0,6) |  3 | renee
 (0,7) |  4 | jack
 (0,8) |  5 | rose
(8 rows)
 
david=#
 
查询重复数据数
 
david=# select distinct id, count(*) from emp group by id having count(*) > 1;
 id | count
----+-------
  1 |     3
  2 |     2
(2 rows)
 
david=#
 
查询出 id 为1的记录有3条,id 为2的记录有2条。
 
四、查询要保留的数据
 
以 min(ctid) 或 max(ctid) 为准。
 
david=# select ctid, * from emp where ctid in (select min(ctid) from emp group by id);
 ctid  | id | name 
-------+----+-------
 (0,1) |  1 | david
 (0,4) |  2 | sandy
 (0,6) |  3 | renee
 (0,7) |  4 | jack
 (0,8) |  5 | rose
(5 rows)
 
david=#
 
五、删除重复数据
 
david=# delete from emp where ctid not in (select min(ctid) from emp group by id);
DELETE 3
david=#
 
六、查看最后结果
 
david=# select ctid, * from emp;
 ctid  | id | name 
-------+----+-------
 (0,1) |  1 | david
 (0,4) |  2 | sandy
 (0,6) |  3 | renee
 (0,7) |  4 | jack
 (0,8) |  5 | rose
(5 rows)
 
david=#
 
说明:如果表中已经有标明唯一的序列主键值,可以把该值替换上述的ctid直接删除。
 
七、其他方法
 
也可以使用以下SQL删除重复数据。
 
david=# delete from emp a
david-# where a.ctid <>
david-# (
david(# select min(b.ctid) from emp b
david(# where a.id = b.id
david(# );
DELETE 3
david=#
 
说明:在表数据量较大的情况下,这种删除方法效率很高。


SELECT distinct
"public"."手机配件-201403"."订单号","public"."手机配件-201403"."商品三级分类",sum("public"."手机配件-201403"."订单实际运费"),count("public"."手机配件-201403"."订单号")
FROM
"public"."手机配件-201403"
GROUP BY
"public"."手机配件-201403"."订单号",
"public"."手机配件-201403"."商品三级分类"

SELECT distinct
"public"."手机配件-201403"."订单号",sum("public"."手机配件-201403"."订单实际运费")
FROM
"public"."手机配件-201403"
WHERE
"public"."手机配件-201403"."商品三级分类" = '手机贴膜'

GROUP BY
"public"."手机配件-201403"."订单号"


SQL Where 语句说明 

WHERE 子句用于规定选择的标准。
WHERE 子句
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值下面的运算符可在 WHERE 子句中使用:
操作符
描述
=
等于
<>
不等于
>
大于
<
小于
>=
大于等于
<=
小于等于
BETWEEN
在某个范围内
LIKE
搜索某种模式
注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。
使用 WHERE 子句
如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'"Persons" 表
LastName
FirstName
Address
City
Year
Adams
John
Oxford Street
London
1970
Bush
George
Fifth Avenue
New York
1975
Carter
Thomas
Changan Street
Beijing
1980
Gates
Bill
Xuanwumen 10
Beijing
1985
结果:
LastName
FirstName
Address
City
Year
Carter
Thomas
Changan Street
Beijing
1980
Gates
Bill
Xuanwumen 10
Beijing
1985


请注意,我们在例子中的条件值周围使用的是单引号。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
文本值:
这是正确的:SELECT * FROM Persons WHERE FirstName='Bush'
这是错误的:SELECT * FROM Persons WHERE FirstName=Bush
数值:
这是正确的:SELECT * FROM Persons WHERE Year>1965
这是错误的:SELECT * FROM Persons WHERE Year>'1965'


  评论这张
 
阅读(952)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017