读书人

怎样用一条SQL语句找出二义的记录非

发布时间: 2011-12-31 23:50:30 作者: rapoo

求教:怎样用一条SQL语句找出二义的记录,非重复记录?
表结构:
create table gprsdata (i_datetime char(12), i_lon char(10), i_lat char(10))


典型数据:
I_DATETIMEI_LONI_LAT
1070124080000113.02466223.094220
2070124080000113.19084823.121777
3070124080000113.19085223.121882
4070124111551113.02486223.093942
5070124111551113.02486223.093942
6070124121003113.02482323.093927
7070124121003113.02482323.093927
...
135070125075253113.19077323.121885
136070125075253113.19077323.121885
137070125080000113.29466223.141098
138070125080000113.29466223.141098
139070125080000113.02459723.094357
140070125080253113.19077323.121885
141070125080253113.19077323.121885
...


其中1~3这三条记录的经纬度数据 i_lon/i_lat 都不相同,存在二义性。
137~139这三条记录也是同样存在二义性。但要注意,它只有两条记录不同。
而其他记录只是重复,并无二义性,应该剔出。


问题(1).我希望将所有带二义性的记录找出来,如:
I_DATETIMEI_LONI_LAT
1070124080000113.02466223.094220
2070124080000113.19084823.121777
3070124080000113.19085223.121882
4070125080000113.29466223.141098
5070125080000113.29466223.141098
6070125080000113.02459723.094357
7070127080000 84.06799831.296920
8070127080000113.17873723.114500
9070127080000113.17873323.114515
10070130080000113.29491023.141598
11070130080000113.25619223.134617


问题(2).我还希望能对这些二义性记录进行统计分析(注意070125080000虽然有三条,但有一条重复,所以算成2),如:
I_DATETIMECOUNT(*)
10701240800003
20701250800002
30701270800003
40701300800002
50702020800002
60702030800002
70702050800005
...


我现在利用视图勉强解决了这个问题,但不够方便。

1、创建不包括重复项的视图:
create or replace view CheckPoint as
select DISTINCT i_datetime, i_lon, i_lat from gprsdata where i_datetime> = '070101000000 ' order by i_datetime ASC

2、对二义记录进行统计:
select i_datetime,count(*) from CheckPoint group by i_datetime having count(*)> 1

3、找出二义记录
select * from gprsdata where i_dateTime in
(select i_datetime from CheckPoint group by i_datetime having count(*)> 1)
order by i_datetime ASC

4、删除视图:
drop view CheckPoint


能不能只用一条SQL语句就完成这样的查询。而且最好是标准的SQL,非Oracle也能用。


[解决办法]
其实你自己已经解决了,把1和3合一下,再写个子查询就行了

[解决办法]
select * from gprsdata a
where a.rowid > (
select min(b.rowid) from gprsdata b
where a.i_lon = b.i_lon
and ...
)

根据需要构建括号里面的where就可以了
[解决办法]
重复纪录和二义记录
有什么区别啊?
难道不一样!问题1已经解决了吧!
[解决办法]
select i_datetime,count(*)
from (select distinct i_datetime,i_lon,i_lat from gprsdata)
group by i_datetime
having count(*)> 1

先用distinct去掉重复纪录,再统计i_datetime相同,i_lon/i_lat 不同的记录条数
大于1就是二义记录,已统计

你再
select * from gprsdata
where exists(select i_datetime,count(*)
from (select distinct i_datetime,i_lon,i_lat from gprsdata)


group by i_datetime
having count(*)> 1)
就能查出那些纪录是二义记录



[解决办法]
我也不知道从哪开始可以用的
和数据库有关,不是所有的数据库都可以用子查询的
-_-

读书人网 >oracle

热点推荐