求高手,sql2000每行返回另表差值最小的10行

czphs 2011-04-22 04:33:44
a lng dmn
桂东沙田 113.807 25.83
桂东广电 113.933 26.0564
桂东一中 113.945 26.0814
(600行)
B(地标点) lng dmn
径口 113.80257 25.822257
横屋 113.803948 25.820615
云岭 113.80613 25.821791
石桥镇 112.402757 25.736888
肖家镇 112.475639 25.69247
普满乡 112.516254 25.694456
十字乡 112.472104 25.849118
樟木乡 112.48391 25.913517
飞仙镇 112.445102 25.806848
余田乡 112.535115 25.834617
流峰镇 112.480845 25.971274
欧阳海乡 112.527567 26.027794
燕塘乡 112.566137 25.626169
行廊镇 112.477496 25.635925
(2w行)

现求a表中的每个地址距离b表中最近的10个点。



select top 10 *, 100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6) distance from a,b where a.name='桂东沙田' order by distance
结果如下
name lng dmn name lng dmn distance
桂东沙田 113.807 25.83 桥头庙 113.809391 25.831453 0.2798
桂东沙田 113.807 25.83 联洞村 113.808246 25.834186 0.4368
桂东沙田 113.807 25.83 大坪垇 113.804516 25.825783 0.4894
桂东沙田 113.807 25.83 五头洞 113.80231 25.831449 0.4909
桂东沙田 113.807 25.83 黄泥田 113.801123 25.829001 0.5961
桂东沙田 113.807 25.83 石下 113.803465 25.835617 0.6637
桂东沙田 113.807 25.83 塘湾 113.800928 25.826708 0.6907
桂东沙田 113.807 25.83 茅屋 113.801627 25.834443 0.6972
桂东沙田 113.807 25.83 烂祠堂 113.811239 25.835907 0.7271
桂东沙田 113.807 25.83 半屯 113.814583 25.832914 0.8124


如何实现a表中每行一次计算出10个和b表距离最近的10个点。
或者a单行后面带10个距离最近点,如
name lng dmn name1 lng dmn distance name2 lng dmn 。。。。
桂东沙田 113.807 25.83 桥头庙 113.809391 25.831453 0.2798 联洞村 113.808246 25.834186。。。。。


...全文
127 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
czphs 2011-07-15
  • 打赏
  • 举报
回复

drop table evdorate
select 起始时间 samplingtime,周期 cycle,网元名称 name,小区号 area,扇区号 sector,载频号 carrier,AN发起连接成功次数 AN发起连接成功次数,AN发起连接成功率 AN发起连接成功率,AN发起连接请求次数 AN发起连接请求次数,
[AN发起连接失败(MEID连接拒绝)] AN发起连接失败MEID连接拒绝,[AN发起连接失败(反向业务信道捕获失败)] AN发起连接失败反向业务信道捕获失败,[AN发起连接失败(分配呼叫资源失败)] AN发起连接失败分配呼叫资源失败,
[AN发起连接失败(没有收到TrafficChannelComplete)] AN发起连接失败没有收到TrafficChannelComplete,[AN发起连接失败(其它原因)] AN发起连接失败其它原因,AT发起连接成功次数 AT发起连接成功次数,
AT发起连接成功率 AT发起连接成功率,AT发起连接请求次数 AT发起连接请求次数,[AT发起连接失败(MEID连接拒绝)] AT发起连接失败MEID连接拒绝,[AT发起连接失败(反向业务信道捕获失败)] AT发起连接失败反向业务信道捕获失败,
[AT发起连接失败(分配呼叫资源失败)] AT发起连接失败分配呼叫资源失败,[AT发起连接失败(漫游限制失败)] AT发起连接失败漫游限制失败,[AT发起连接失败(没有收到TrafficChannelComplete)] AT发起连接失败没有收到TrafficChannelComplete,
[AT发起连接失败(其它原因)] AT发起连接失败其它原因,连接成功次数 连接成功次数,连接成功率 连接成功率,连接请求次数 连接请求次数 into evdorate from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;DATABASE=D:\sql\excel\evdo\载频级_DO连接成功率.xls',Sheet1$)
czphs 2011-07-15
  • 打赏
  • 举报
回复
drop table evdorate
select 起始时间 samplingtime,周期 cycle,网元名称 name,小区号 area,扇区号 sector,载频号 carrier,AN发起连接成功次数 AN发起连接成功次数,AN发起连接成功率 AN发起连接成功率,AN发起连接请求次数 AN发起连接请求次数,
[AN发起连接失败(MEID连接拒绝)] AN发起连接失败MEID连接拒绝,[AN发起连接失败(反向业务信道捕获失败)] AN发起连接失败反向业务信道捕获失败,[AN发起连接失败(分配呼叫资源失败)] AN发起连接失败分配呼叫资源失败,
[AN发起连接失败(没有收到TrafficChannelComplete)] AN发起连接失败没有收到TrafficChannelComplete,[AN发起连接失败(其它原因)] AN发起连接失败其它原因,AT发起连接成功次数 AT发起连接成功次数,
AT发起连接成功率 AT发起连接成功率,AT发起连接请求次数 AT发起连接请求次数,[AT发起连接失败(MEID连接拒绝)] AT发起连接失败MEID连接拒绝,[AT发起连接失败(反向业务信道捕获失败)] AT发起连接失败反向业务信道捕获失败,
[AT发起连接失败(分配呼叫资源失败)] AT发起连接失败分配呼叫资源失败,[AT发起连接失败(漫游限制失败)] AT发起连接失败漫游限制失败,[AT发起连接失败(没有收到TrafficChannelComplete)] AT发起连接失败没有收到TrafficChannelComplete,
[AT发起连接失败(其它原因)] AT发起连接失败其它原因,连接成功次数 连接成功次数,连接成功率 连接成功率,连接请求次数 连接请求次数 into evdorate from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;DATABASE=D:\sql\excel\evdo\载频级_DO连接成功率.xls',Sheet1$)
czphs 2011-04-23
  • 打赏
  • 举报
回复
不好意思,是我理解错了。
3楼是正解,请问还能否减少点计算量,我a表600行,b表2万行,运行了6个小时了都没有出结果。
zzhqiao 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 czphs 的回复:]
SQL code
(select top 10 c.name from b order ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6))

这个结果是a表中 所有行 与b表比对的top10,
我的要求是a表中每一行分别与b表比对的top10。
3楼的结果是a表每行带的10个结果是一样的,我的要求a表每行带所带的b……
[/Quote]
select *, 100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6) distance from a,b
where b.name
in(select top 10 c.name from b order ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6))
这里不就是你要的结果吗?这里的top 10是根据a表记录变动而变动的就是你说的每一行分别与b表比对的top10
快溜 2011-04-22
  • 打赏
  • 举报
回复
发贴可以带点数据
例如
create table tb2(name varchar(10),lng numeric(18,6),dmn numeric(18,6))

insert into tb2
select '径口',113.80257,25.822257 union
select '横屋',113.803948,25.820615 union
select '云岭',113.80613,25.821791 union
select '石桥镇',112.402757,25.736888 union
select '肖家镇',112.475639,25.69247 union
select '普满乡',112.516254,25.694456
这样别人可以快速帮你结果问题。对谁都有好处。
快溜 2011-04-22
  • 打赏
  • 举报
回复

create table tb1(name varchar(10),lng numeric(18,6),dmn numeric(18,6))
insert into tb1 select '桂东沙田', 113.807, 25.83 union
select '桂东广电', 110.933, 26.0564

create table tb2(name varchar(10),lng numeric(18,6),dmn numeric(18,6))

insert into tb2
select '径口',113.80257,25.822257 union
select '横屋',113.803948,25.820615 union
select '云岭',113.80613,25.821791 union
select '石桥镇',112.402757,25.736888 union
select '肖家镇',112.475639,25.69247 union
select '普满乡',112.516254,25.694456


select * from tb1 a,tb2 b where
b.name in(select top 4 name from tb2 order by
100*ROUND(SQRT(POWER((a.lng-lng),2)+POWER((a.dmn-dmn),2)),6) desc)

/*
name lng dmn name lng dmn
---------- --------------------------------------- --------------------------------------- ---------- --------------------------------------- ---------------------------------------
桂东沙田 113.807000 25.830000 横屋 113.803948 25.820615
桂东沙田 113.807000 25.830000 普满乡 112.516254 25.694456
桂东沙田 113.807000 25.830000 石桥镇 112.402757 25.736888
桂东沙田 113.807000 25.830000 肖家镇 112.475639 25.692470
桂东广电 110.933000 26.056400 横屋 113.803948 25.820615
桂东广电 110.933000 26.056400 径口 113.802570 25.822257
桂东广电 110.933000 26.056400 普满乡 112.516254 25.694456
桂东广电 110.933000 26.056400 云岭 113.806130 25.821791

(8 行受影响)
czphs 2011-04-22
  • 打赏
  • 举报
回复
(select top 10 c.name from b  order ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6))

这个结果是a表中 所有行 与b表比对的top10,
我的要求是a表中每一行分别与b表比对的top10。
3楼的结果是a表每行带的10个结果是一样的,我的要求a表每行带所带的b表行值不一定相同(取各自比对的top10)。
zzhqiao 2011-04-22
  • 打赏
  • 举报
回复

select *, 100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6) distance from a,b
where b.name
in(select top 10 c.name from b order ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6))
zzhqiao 2011-04-22
  • 打赏
  • 举报
回复
3楼的答案是对的,你按照你的要求修改下好了

select top *, 100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6) distance from a,b where b.name in(select top 10 c.name from b order ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6))
czphs 2011-04-22
  • 打赏
  • 举报
回复
自己顶起一下,跪求高手帮忙解决
快溜 2011-04-22
  • 打赏
  • 举报
回复
没测试数据,瞎写的。你给点建表语句和测试数据,方便你快速得到答案。
czphs 2011-04-22
  • 打赏
  • 举报
回复
是算距离的
结果就是a表的每一行变成10行,每行后面带一个与a表各个点距离最近的b表的点。
你的这个结果貌似理解错了吧。
快溜 2011-04-22
  • 打赏
  • 举报
回复

--100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6)这个是不是算距离的?
select * from 表A a,表B b where
b.name in(select top 10 name from 表B order by
100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6) desc)
czphs 2011-04-22
  • 打赏
  • 举报
回复
name lng dmn name lng dmn distance
桂东沙田 113.807 25.83 桥头庙 113.809391 25.831453 0.2798
桂东沙田 113.807 25.83 联洞村 113.808246 25.834186 0.4368
桂东沙田 113.807 25.83 大坪垇 113.804516 25.825783 0.4894
桂东沙田 113.807 25.83 五头洞 113.80231 25.831449 0.4909
桂东沙田 113.807 25.83 黄泥田 113.801123 25.829001 0.5961
桂东沙田 113.807 25.83 石下 113.803465 25.835617 0.6637
桂东沙田 113.807 25.83 塘湾 113.800928 25.826708 0.6907
桂东沙田 113.807 25.83 茅屋 113.801627 25.834443 0.6972
桂东沙田 113.807 25.83 烂祠堂 113.811239 25.835907 0.7271
桂东沙田 113.807 25.83 半屯 113.814583 25.832914 0.8124
桂东广电。。。。。

共10行

桂东一中

共10行






这种结果,高手麻烦对我的语句编辑修改下。
select top 10 *, 100*ROUND(SQRT(POWER((a.lng-b.lng),2)+POWER((a.dmn-b.dmn),2)),6) distance from a,b where a.name='桂东沙田' order by distance
AcHerat 元老 2011-04-22
  • 打赏
  • 举报
回复
1# 你把所有的查询出来,结果类似这个样子

name lng dmn name lng dmn distance
桂东沙田 113.807 25.83 桥头庙 113.809391 25.831453 0.2798
桂东沙田 113.807 25.83 联洞村 113.808246 25.834186 0.4368
桂东沙田 113.807 25.83 大坪垇 113.804516 25.825783 0.4894
桂东沙田 113.807 25.83 五头洞 113.80231 25.831449 0.4909
桂东沙田 113.807 25.83 黄泥田 113.801123 25.829001 0.5961
桂东沙田 113.807 25.83 石下 113.803465 25.835617 0.6637
桂东沙田 113.807 25.83 塘湾 113.800928 25.826708 0.6907
桂东沙田 113.807 25.83 茅屋 113.801627 25.834443 0.6972
桂东沙田 113.807 25.83 烂祠堂 113.811239 25.835907 0.7271
桂东沙田 113.807 25.83 半屯 113.814583 25.832914 0.8124


给这个结果集加一个分组的字段,按照name来分,例如 所有 桂东沙田 的都是 1

2# 然后拼动态SQL行转列语句,搜索下,很多,用这个分组的字段group就行!

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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