0

私はSQLを持っていますtable: 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()またはを使用してtruncate()ください:

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

より一般的なソリューションでは、精度の2つの変数を定義します。

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

緯度をfloatからintに変換してから、変換された値でグループ化します。フロートを変換すると、たとえば2.1または2.7から、2になると思います。したがって、2.000から2.999までのすべての値は同じ変換値2になります。私はSQLサーバーの出身なので、SQLはSQLサーバーに基づいています。

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 に答える