当前位置:编程学习 > VB >>

送分100分:关于去除重复记录的SQL问题

现有一个问题是:

有100位用户,每户一块电能表,每个月要用红外抄表器抄一下每块表的信息,这些信息包括:表号,户号,剩余电量,购电次数,总购电量,总用电量。  有可能会重复抄了,导致数据有些重复,但数据不一定完全一样,比如表号2、户号1的用户,第一次抄时:剩余电量=100,购电次数=3,总购电量=1200,总用电量=1100,而第二次抄时(表太多,抄表员也记不清此表有没有抄数了,所以重新抄了一下)的数据为:剩余电量=95,购电次数=3,总购电量=1200,总用电量=1105。

现在的问题是:
    这些数据全部导入到一个数据表中,如何将剩余电量最小的那条记录提取出来。有两种方法:
    1、将剩余电量最小的那条记录提取出来,放到另一张表中,当然包括没有重复记录的也要放到另外的那个表中。
    2、直接从原表中将非剩余电量最小的那些记录删除掉。

 请问以上两个方案的SQL语句如何写。 --------------------编程问答-------------------- 1. select * from 表1 where 剩余电量 =(select min(剩余电量) from 表1)

2. delete from 表1 where 剩余电量 not in(select min(剩余电量) from 表1) --------------------编程问答-------------------- 要加表号,户号,和group by --------------------编程问答-------------------- select 表号,户号,min(剩余电量) as 剩余电量,max(购电次数) as 购电次数,max(总购电量) as 总购电量,max(用电总量) as 用电总量
from TB group by 表号,户号 --------------------编程问答-------------------- SELECT total.用户ID, Min(total.剩余电量) AS 剩余电量の最小, total.购电次数, total.总购电量, Max(total.总用电量) AS 总用电量の最大
FROM total
GROUP BY total.用户ID, total.购电次数, total.总购电量; --------------------编程问答--------------------
引用 3 楼 bestbadgod 的回复:
select 表号,户号,min(剩余电量) as 剩余电量,max(购电次数) as 购电次数,max(总购电量) as 总购电量,max(用电总量) as 用电总量
from TB group by 表号,户号


我做了一下试验,你这个查询语句执行后的结果是每个表号户号对应的只提取了一条记录,但这条记录中的数据不是从一条记录中提取的,而是从这个表号和户号对应的记录中按字段提取的,说的再仔细一些如下:
表号 户号 购电次数 剩余电量 总购电量 总用电量
22 1 0 33 2345 0
22 1 0 443 0 0
22 1 1 23 0 887676
22 1 1 243 0 0
22 1 2 76 876 865
22 1 2 76 876 865

以上记录生成的结果是:
表号 户号 购电次数1 剩余电量1 总购电量1 总用电量1
22 1 2          23           2345          887676

也就是说,这条记录是东拼西凑出来的,不是直接从原始记录中提取的一条完整记录。 --------------------编程问答-------------------- 我的意图是,首先取购电次数最高,而后取剩余电量最少的那条原始记录。谢谢大家。 --------------------编程问答-------------------- SELECT E.用户ID,E.表ID,E.剩余电量, E.购电次数, E.总购电量, E.总用电量
from (SELECT C.用户ID, Min(C.剩余电量) AS 剩余电量の最小, B.购电次数の最大
from (SELECT A.用户ID, Max(A.购电次数) AS 购电次数の最大 FROM total AS A GROUP BY A.用户ID)  as B INNER JOIN total as C ON B.用户ID = C.用户ID AND  (B.购电次数の最大 = C.购电次数) 
GROUP BY C.用户ID, B.购电次数の最大) as D INNER JOIN total E ON (D.购电次数の最大 = E.购电次数) AND (E.剩余电量 = D.剩余电量の最小) AND (D.用户ID = E.用户ID);
--------------------编程问答-------------------- select a.用户ID,a.表ID,a.剩余电量,a.购电次数,a.总购电量,a.总用电量 from TB a right join
(select 用户ID,表ID,min(剩余电量) as 剩余电量 from TB group by 用户ID,表ID )b on a.用户ID=b.用户ID and a.表ID=b.表ID and a.剩余电量=b.剩余电量 --------------------编程问答-------------------- 很简单的问题说的那么复杂.或者是我没明白楼主说什么?
几次说的东西都不一样......

select 表号,户号,max(购电次数) as 购电次数1,min(剩余电量) as 剩余电量1,
max(总购电量) as 总购电量1,max(总用电量) as 总用电量1 from table where 表号='22' and 户号='1'
--------------------编程问答-------------------- 就是表号一样、购电次数一样的记录,只保留剩余电量最小的记录
delete from table1 a
where exists (select * from table1 b
               where b.表号=a.表号
                    and b.购电次数=a.购电次数
                    and b.剩余电量<a.剩余电量)
--------------------编程问答--------------------
引用 10 楼 tiger_zhao 的回复:
就是表号一样、购电次数一样的记录,只保留剩余电量最小的记录
SQL codedeletefrom table1 awhereexists (select*from table1 bwhere b.表号=a.表号and b.购电次数=a.购电次数and b.剩余电量<a.剩余电量)

好像也不是,你看他5楼的,就是个混合的东东... --------------------编程问答-------------------- 查询及删除重复记录的方法
(一)
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people 
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段) 
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)


5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

--------------------编程问答--------------------
引用 6 楼 comusb 的回复:
我的意图是,首先取购电次数最高,而后取剩余电量最少的那条原始记录。谢谢大家。

lz的这个问题,看我在另一帖的回答,1F
http://topic.csdn.net/u/20100205/20/675e5d68-8d7c-4bf6-99aa-b368343b0290.html?99330 --------------------编程问答-------------------- 如果只要保留购电次数最大的一条,再加条件
delete from table1 a
where exists (select * from table1 b
               where b.表号=a.表号
                    and (  (b.购电次数=a.购电次数 and b.剩余电量<a.剩余电量)
                      or(b.购电次数>a.购电次数)
                      )
             )
--------------------编程问答--------------------
补充:VB ,  网络编程
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,