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

zyl910 2007-05-14 04:17:57
表结构:
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也能用。
...全文
421 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyl910 2007-05-16
  • 打赏
  • 举报
回复

结账了
HelloWorld_001 2007-05-16
  • 打赏
  • 举报
回复
我也不知道从哪开始可以用的
和数据库有关,不是所有的数据库都可以用子查询的
-_-
zyl910 2007-05-16
  • 打赏
  • 举报
回复
谢谢楼上,问题解决了:
select * from gprsdata
where i_datetime in (select i_datetime
from (select distinct i_datetime,i_lon,i_lat from gprsdata)
where i_datetime>='070510000000'
group by i_datetime
having count(*)>1)


没想到select语句也能做为from的参数
这是SQL标准的那个版本定义的?
HelloWorld_001 2007-05-16
  • 打赏
  • 举报
回复
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)
就能查出那些纪录是二义记录



zyl910 2007-05-16
  • 打赏
  • 举报
回复
二义记录是指:i_datetime相同,i_lon/i_lat 不同的记录,因为同一时间只可能在一个位置

问题1:找出二义记录
问题2:对二义记录进行统计分析
HelloWorld_001 2007-05-16
  • 打赏
  • 举报
回复
重复纪录和二义记录
有什么区别啊?
难道不一样!问题1已经解决了吧!
zyl910 2007-05-16
  • 打赏
  • 举报
回复
将楼上语句改成了这样:
select i_datetime,i_lon,i_lat from gprsdata a
where a.rowid > (
select min(b.rowid) from gprsdata b
where a.i_datetime=b.i_datetime and a.i_lon = b.i_lon and a.i_lat = b.i_lat
and b.i_datetime>'070510000000'
)

查询结果:
I_DATETIME I_LON I_LAT
1 070511080016 114.570817 22.743793
2 070511082016 114.469357 22.770272
3 070511084016 114.474900 22.807097
4 070510120033 114.486877 22.905972
5 070510124033 114.346012 23.024877
6 070510131030 114.357125 23.093532
7 070510133030 114.357125 23.093532
8 070510135027 114.387673 23.058675


似乎是找出重复记录,而我要的是找出二义记录
hot.wind 2007-05-15
  • 打赏
  • 举报
回复
select * from gprsdata a
where a.rowid > (
select min(b.rowid) from gprsdata b
where a.i_lon = b.i_lon
and ...
)

根据需要构建括号里面的where就可以了
zyl910 2007-05-15
  • 打赏
  • 举报
回复
up
zyl910 2007-05-14
  • 打赏
  • 举报
回复
// 把1和3合一下,再写个子查询就行了

不懂怎么和DISTINCT关键字
bjt_ 2007-05-14
  • 打赏
  • 举报
回复
其实你自己已经解决了,把1和3合一下,再写个子查询就行了

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧