需求:
一个数据表,找出按某一个字段分组,坐标范围最小值不满足要求的数据
描述说明:
1、距离可以用r*arccos[cos(y1)*cos(y2)*cos(x1-x2)+sin(y1)*sin(y2)]来算
2、r是地球半径6371km,x是经度,y是纬度
3、sin和cos函数的参数是以弧度为单位的角度,所以x1、x2、y1、y2要用弧度表示,角度换成弧度公式:换成RADIANS(y1)
4、A、B两点经纬度距离,单位米
6371 * 1000 * acos(
cos(radians(cast(A.lat as decimal))) * cos(radians(cast(B.lat as decimal))) * cos(
radians(cast(B.lon as decimal)) - radians(cast(A.lon as decimal))
) + sin(radians(cast(A.lat as decimal))) * sin(radians(cast(B.lat as decimal)))
)
如果查询,坐标位置为【113.65、34.76】到其他坐标的的距离,sql如下
SELECT *, ACOS(
COS(RADIANS(34.76)) *
COS(RADIANS(cast(lat as decimal))) *
COS(RADIANS(cast(lon as decimal)) - RADIANS(113.65)) +
SIN(RADIANS(34.76)) *
SIN(RADIANS(cast(lat as decimal)))
) * 6378 as distance
FROM gse_test_zb
5、查询数据表任意2行数据的差
数据表gse_test_zb(id,pro_num,.....) ,主键是id,按pro_num分组,分组内坐标之间距离小于1000米,找不到不符合要求的数据.
数据表做自关联,分别计算组内坐标,如果组内坐标最小值大于1000秒,找出分组的pro_num
select *
from gse_test_zb
where project_no in (select A.project_no
from gse_test_zb A, gse_test_zb B
where A.id ! = B.id and A.project_no = B.project_no
group by
A.project_no
having
min(
6371 * 1000 * acos(
cos(radians(cast(A.lat as decimal))) * cos(radians(cast(B.lat as decimal))) * cos(
radians(cast(B.lon as decimal)) - radians(cast(A.lon as decimal))
) + sin(radians(cast(A.lat as decimal))) * sin(radians(cast(B.lat as decimal)))
)
) > 1000
)