求教:怎样用一条SQL语句找出二义的记录,非重复记录?
表结构:
create table gprsdata (i_datetime char(12), i_lon char(10), i_lat char(10))
典型数据:
I_DATETIME I_LON I_LAT
1 070124080000 113.024662 23.094220
2 070124080000 113.190848 23.121777
3 070124080000 113.190852 23.121882
4 070124111551 113.024862 23.093942
5 070124111551 113.024862 23.093942
6 070124121003 113.024823 23.093927
7 070124121003 113.024823 23.093927
...
135 070125075253 113.190773 23.121885
136 070125075253 113.190773 23.121885
137 070125080000 113.294662 23.141098
138 070125080000 113.294662 23.141098
139 070125080000 113.024597 23.094357
140 070125080253 113.190773 23.121885
141 070125080253 113.190773 23.121885
...
其中1~3这三条记录的经纬度数据 i_lon/i_lat 都不相同,存在二义性。
137~139这三条记录也是同样存在二义性。但要注意,它只有两条记录不同。
而其他记录只是重复,并无二义性,应该剔出。
问题(1).我希望将所有带二义性的记录找出来,如:
I_DATETIME I_LON I_LAT
1 070124080000 113.024662 23.094220
2 070124080000 113.190848 23.121777
3 070124080000 113.190852 23.121882
4 070125080000 113.294662 23.141098
5 070125080000 113.294662 23.141098
6 070125080000 113.024597 23.094357
7 070127080000 84.067998 31.296920
8 070127080000 113.178737 23.114500
9 070127080000 113.178733 23.114515
10 070130080000 113.294910 23.141598
11 070130080000 113.256192 23.134617
问题(2).我还希望能对这些二义性记录进行统计分析(注意070125080000虽然有三条,但有一条重复,所以算成2),如:
I_DATETIME COUNT(*)
1 070124080000 3
2 070125080000 2
3 070127080000 3
4 070130080000 2
5 070202080000 2
6 070203080000 2
7 070205080000 5
...
我现在利用视图勉强解决了这个问题,但不够方便。
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 fr