日期:2014-05-17  浏览次数:20648 次

求教:怎样用一条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