首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

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

2011-12-31 
求教:怎样用一条SQL语句找出二义的记录,非重复记录?表结构:createtablegprsdata(i_datetimechar(12),i_lon

求教:怎样用一条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)
就能查出那些纪录是二义记录



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

热点排行