3

ジオタグ付きの値 (経度、緯度、値) を含む 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 の 4 つの raw が取得されます。これは、データセットが比較的小さい場合に機能します。データが大きい場合は、丸められた場所 (10.123, 53.567) を sql にクエリし、sql が次のようなものを返す必要があります。

Long            lat           value
10.123       53.567      10 (this is the average of 10, 12, and 18)
10.124       53.568      13

これは可能ですか?場所に基づいて大規模なデータセットを平均化するにはどうすればよいですか?

そもそもSQLデータベースは正しい選択ですか?

4

3 に答える 3

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 句を追加します。

于 2012-04-30T13:08:35.183 に答える
1

以下は、手始めに使用できる大まかな疑似コードです。プロジェクトで使用している SQL の方言で round 関数に適切な精度の引数を指定する必要があるため、Round の 2 番目の引数として指定する 3 は、数値が丸められる精度の小数点以下の桁数であることを理解してください。 、元の投稿で示されているように。

round(lat,3),round(long,3),avg(value)を選択 round(lat,3),round(long,3)でグループ化

于 2012-04-30T13:10:02.623 に答える
1

丸めアプローチの問題は、境界条件です。つまり、点が境界に近い場合に何が起こるかです。

ただし、特定のポイントの近傍については、次のようなものを使用することをお勧めします。

select *
from table
where long between @MyLong - @DeltaLong and @MyLong + @DeltaLong and
      lat between @MyLat - @DeltaLat and @MyLat + @DeltaLat

このためには、@DeltaLong と @DeltaLat を定義する必要があります。

それが問題である場合、丸めは要約のためにうまく機能します。

于 2012-04-30T14:30:29.147 に答える