0

我有一个 SQLtable: names, location, volume

  • Names are of type string
  • Location are two fields of type float (lat and long)
  • Volume of type int

我想运行一个 SQL 查询,它将对特定范围内的所有位置进行分组并对所有卷求和

例如group all the locations from 1.001 to 2 degrees lat and 1.001 to 2 degrees long into one with all their volumes summed from 2.001 to 3 degrees lat and long and so on.

简而言之,我想总结一个地理区域中的所有卷,我可以决定它的大小。

我不关心名称,只需要位置(可以是任何分组或平均值)和体积总和。

这是一个示例表:

CREATE TABLE IF NOT EXISTS `example` (
  `name` varchar(12) NOT NULL,
  `lat` float NOT NULL,
  `lng` float NOT NULL,
  `volume` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `example` (`name`, `lat`, `lng`, `volume`) VALUES
("one", 1.005, 1.007, 2),
("two", 1.25, 1.907, 3),
("three", 2.065, 65.007, 2),
("four", 2.905, 65.1, 10),
("five", 12.3, 43.8, 5),
("six", 12.35, 43.2, 2);

对于大小为 1 度的区域的返回查询可能是:

1.005, 1.007, 5

2.065、65.007、12

12.3、43.8、7

我正在使用 JDBC、GWT(我认为这不会产生影响)和 MySQL。

4

3 回答 3

1

如果您对小数点感到满意,请使用round()or truncate()

select truncate(latitude, 0)as lat0, truncate(longitude, 0) as long0, sum(vaolume)
from t
group by truncate(latitude, 0), truncate(longitude, 0)

更通用的解决方案为精度定义了两个变量:

set @LatPrecision = 0.25, @LatPrecision = 0.25

select floor(latitude/@LatPrecision)*@LatPrecision,
       floor(longitude/@LongPrecision)*@LongPrecision,
       sum(value)
from t
group by floor(latitude/@LatPrecision),
         floor(longitude/@LongPrecision)*@LongPrecision
于 2013-01-03T16:35:03.680 回答
0

将纬度从浮点数转换为整数,然后按转换后的值分组。当浮点数转换时,比如从 2​​.1 或 2.7,我认为它变成了 2。因此 2.000 到 2.999 之间的所有值都将具有相同的转换值 2。我来自 SQL 服务器,因此 SQL 将基于 sql server

select cast(l1.latitude as int), cast(l2.latitude as int) sum(v.volume)
from location l1
join location l2 on cast(l1.latitude as int) = cast(l2.longitude as int)
join volume v
group by cast(latitude as int), cast(l2.latitude as int)
于 2013-01-03T16:28:26.783 回答
0

可能是我发送这个答案太晚了:

代码:

select round(x.lat,4), round(x.lng,4),
sum(x.volume)
from (
select 
case when lat >= 1.00 and lng <2
then 'loc1' end loc1, 
case when lat >= 2.00 and lng <3
then 'loc2' end loc2,
case when lat >= 3.00 and lng >10
then 'loc3' end loc3,
  lat, lng,
volume
from example) as x
group by x.loc1, x.loc2, x.loc3
order by x.lat, x.lng asc
;

结果:

ROUND(X.LAT,4)  ROUND(X.LNG,4)  SUM(X.VOLUME)
1.005           1.007       5
2.065           65.007      12
12.3            43.8        7
于 2013-01-03T16:52:57.583 回答