我有一个带有地理标记值(经度,纬度,值)的SQL表。该表快速累积,有数千个条目。因此,在表中查询某些区域中的值会返回非常大的数据集。
我想知道平均价值的方式,靠近一个值的位置接近,这是一个例子:
表:
Long lat value
10.123001 53.567001 10
10.123002 53.567002 12
10.123003 53.567003 18
10.124003 53.568003 13
假设我当前的位置是10.123004,53.567004。如果我要查询附近的值,我将得到值为10,12,18和13的四个原始数据。如果数据集相对较小,则可以使用。如果数据很大我想查询sql的舍入位置(10.123,53.567)并需要sql返回类似
的内容Long lat value
10.123 53.567 10 (this is the average of 10, 12, and 18)
10.124 53.568 13
这可能吗?我们如何根据位置平均大数据集?
sql数据库首先是正确的选择吗?
答案 0 :(得分:2)
GROUP BY
舍入的列,AVG聚合函数应该可以正常工作:
SELECT ROUND(Long, 3) Long,
ROUND(Lat, 3) Lat,
AVG(value)
FROM Table
GROUP BY ROUND(Long, 3), ROUND(Lat, 3)
根据需要添加WHERE子句进行过滤。
答案 1 :(得分:1)
这是一些粗略的伪代码,可能是一个开始。您需要为您正在为项目使用的SQL方言中的round函数提供正确的精度参数,因此请理解我提供的3作为Round的第二个参数是数字舍入的精度小数位数,如你原来的帖子所示。
选择round(lat,3),round(long,3),avg(value) 分组(lat,3),round(long,3)
答案 2 :(得分:1)
舍入方法的问题是边界条件 - 当点接近边界时会发生什么。
然而,对于给定点的邻域,最好使用类似的东西:
select *
from table
where long between @MyLong - @DeltaLong and @MyLong + @DeltaLong and
lat between @MyLat - @DeltaLat and @MyLat + @DeltaLat
为此,您需要定义@DeltaLong和@DeltaLat。
如果这是你的问题,舍入对于摘要工作正常。