`

[转]SQL DISTINCT、GROUP BY

阅读更多

 

SQL DISTINCT重复的数据统计方法 group by 重复数据的个数统计 删除重复的数据2008-09-10 16:30DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行。如果没有指定 DISTINCT,那么将返回所有行,包括重复的行。 
select count(distinct t.destaddr)     from nbyd_send t     where t.input_time > to_date('2007-2-1','yyyy-mm-dd') and t.input_time < to_date('2007-3-1','yyyy-mm-dd')

可以统计出一个月中的用户数量。

关于如何快速得知里面每一个号码重复的个数问题的解答:利用分组函数的SQL语句
select t.tel,count(*) from nbyd_deliver t   group   by t.tel ;group by 解决重复数据的个数统计适用于各种关系型数据库,如oracle,SQL Server

查询重复的数据
select * from (select v.xh,count(v.xh) num from sms.vehicle v group by v.xh) where num>1;--169

select v.xh,count(v.xh) num from sms.vehicle v group by v.xh having count(v.xh)=2;

删除重复的数据

create table mayong as (select distinct* from sms.vehicle);

delete from sms.vehicle ;

insert into sms.vehicle select * from mayong;

在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。


下面是查询重复数据的一个例子:

select a.rowid,a.* from 表名 a 
where a.rowid != 
(
select max(b.rowid) from 表名 b 
where a.字段1 = b.字段1 and 
a.字段2 = b.字段2 
)


下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。

而外面就是查询出除了rowid最大之外的其他重复的数据了。
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
delete from 表名 a 
where a.rowid != 
(
select max(b.rowid) from 表名 b 
where a.字段1 = b.字段1 and 
a.字段2 = b.字段2 
)


随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
create table 临时表 as 
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a 
where a.rowid != 
(
select b.dataid from 临时表 b 
where a.字段1 = b.字段1 and 
a.字段2 = b.字段2 
);
commit;


二、对于完全重复记录的删除

对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:
select distinct * from 表名
可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:
CREATE TABLE 临时表 AS (select distinct * from 表名);
delete from table 正式表;
insert into 正式表 (select * from 临时表);
drop table 临时表;

分享到:
评论

相关推荐

    SQL 语法 SQL 总结 SQL教程

    SQL 基础 SQL 首页 SQL 简介 SQL 语法 ...SQL Group By SQL Having SQL ucase() SQL lcase() SQL mid() SQL len() SQL round() SQL now() SQL format() SQL 总结 SQL 快速索引 SQL 总结

    Mysql中distinct与group by的去重方面的区别

    distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分。 单纯的去重操作使用distinct,速度是快于group by的。 distinct支持单列、多列的...

    LINQ to SQL手册

    LINQ to SQL语句(6)之Group By/Having LINQ to SQL语句(7)之Exists/In/Any/All/Contains LINQ to SQL语句(8)之Concat/Union/Intersect/Except LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods LINQ to SQL语句...

    MySQL去重该使用distinct还是group by?

    关于group by 与distinct 性能对比:网上结论如下,不走索引少量数据distinct性能更好,大数据量group by 性能好,走索引group by性能好。走索引时分组种类少distinct快。关于网上的结论做一次验证。 准备阶段屏蔽...

    SQL语句将行转换成列

    select @sql = @sql+' from 表 group by 物料代码' exec(@sql) 简化如下: select (select 物料代码 , sum(case 地区 when '地区' then 数量 end)[地区], sum(case 地区 when '地区' then 比率 end)[比率] ...

    MySQL中distinct语句的基本原理及其与group by的比较

    DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是...

    MySQL中distinct与group by语句的一些比较及用法讲解

    在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group by会做个排序(一般是ASC)。...

    MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个...

    oracle sql 去重复记录不用distinct如何实现

    select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录 所以用distinct达不到想要的效果,用group by 可以解决这个问题。 例如要显示的字段为A、B、C三个,而A字段的内容不能重复...

    行转列sql_server

    sql server 用于行转列,省得各位去找语句,select to_char(wm_concat('''' || valuelabel || '''')) name from (select distinct t.valuelabel from structuredrecruit t) select * from (select t.uhid, t....

    复习笔记SQL34句

    SQL语句(11) Group By 4 SQL语句(12) HAVING 4 SQL语句(13) ALIAS 4 SQL语句(14) 连接 4 SQL语句(15) 外部连接 5 SQL语句(16) Subquery 6 SQL语句(17) UNION 6 SQL语句(18) UNION ALL 6 SQL语句(19) INTERSECT 7 SQL...

    mysql不支持group by的解决方法小结

    一旦开启 only_full_group_by ,感觉,group by 将变成和 distinct 一样,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了 only_full_group_by 模式开启比较...

    oracle中使用group by优化distinct

    今天mentor给了一个sql语句...SELECT DISTINCT 'AMEND_NEW', reporttitle, reportsubtitle, cab_cab_transactions.branchcode, cab_cab_transactions.prtfo_cd, cab_cab_transactions.sstm_scrty_id, cab_cab_tr

    Hive SQL 编译过程详解

    1.2 Group By的实现原理 1.3 Distinct的实现原理 2.1 Phase1 SQL词法,语法解析 2.1.1 Antlr 2.1.2 抽象语法树AST Tree 2.1.3 样例SQL ........... 2.3 Phase3 逻辑操作符Operator ........... 2.4 Phase4 逻辑层...

    SQL语句生成及分析器(中文绿色)

    3.4 分组 (Group By) 3.5 组内条件 (Having) 3.6 排序 (Order By) 3.7 数据表的内连接、外连接 3.7.1 SQL 92 标准:Inner Join、Left Join、Right Join、Full Join, 3.7.2 特殊语法:*=、=*、*=*(MS_SQL,...

    SQL server练习题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu ...A: delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)

    SQL语句教程【经典】

    GROUP BY HAVING ALIAS 表格链接 外部链接 CONCATENATE SUBSTRING TRIM CREATE TABLE CONSTRAINT NOT NULL UNIQUE CHECK 主键 外来键 CREATE VIEW CREATE INDEX ALTER TABLE DROP TABLE ...

    SQL循序渐进,SQL入门基础

    SQL循序渐进(11)------GROUP BY子句 SQL循序渐进(12)------HAVING子句 SQL循序渐进(13)------ORDER BY子句 SQL循序渐进(14)------组合条件和布尔运算符 SQL循序渐进(15)------IN 和 BETWEEN 条件运算符 ...

    MySQL中Distinct和Group By语句的基本使用教程

    MySQL Distinct 去掉查询结果重复记录...SQL 语句: SELECT DISTINCT(username) FROM user 返回查询结果如下: username 小李 小张 小王 提示 使用 DISTINCT 关键字去掉重复记录具有较大的局限性。DISTINCT() 只能包

    SQLQuery5.sql

    from score a left join ( select a.s_score from Score a group by a.s_score having count(a.s_score)&gt;1 and count(distinct a.c_id) &gt; 1)tt on tt.s_score=a.s_score group by a.s_id select distinct a.s_...

Global site tag (gtag.js) - Google Analytics