SQL 2008クエリの問題-地理ポリゴンに存在するLatLongはどれですか?
-
08-07-2019 - |
質問
iには次の2つのテーブルがあります。-
ジオシェイプ
- GeoShapeId INT IDENTITY
- 名前VARCHAR(100)
- ShapeFile GEOGRAPHY [これは緯度/経度の閉じた多角形です]
犯罪ロケーション
- CrimeLocationId INT IDENTITY
- LatLong GEOGRAPHY [これは緯度/経度ポイントです]
現在、約10KのGeoShape結果と約500CrimeLocationsがあります。
500のすべての犯罪緯度/経度ポイントが内部に存在するGeoShapesを特定しようとしています。
:(わかりません!サブクエリで STIntersects
を実行しようとしましたが、機能しませんでした。提案はありますか?
乾杯!
編集1: GEOMETRY
関数を使用することはできません。(上記のように)これらはすべて地理タイプです。
編集2: STContains
および STIntersects
の使用方法を知っています。その基本的な例を提供しないでください。上記のテーブル構造を使用して複雑なクエリを実行することに興味があります。
解決
「編集」に関しては、「提供しないでください...」を含む質問が表示されることはほとんどありません。確かに少しでも役に立ちますか?特に、 STContains
または STIntersects
(または Filter()
について do が知っていることを実際に示していないためです。それについて)...
とにかく、郵便番号と保管場所のデータベースが手元にあったので、テーブル/列の名前をあなたのものに合わせて変更しました(6,535個のCrimeLocatoinsと3,285個のGeoShapesがあります)。あなたは今までにそれを理解していると思います-しかし、他の誰かがこれを役に立つと思うかもしれません...
次のクエリは、各 GeoShapes.ShapeFile
の CrimeLocations の数を返しますSELECT G.Name, COUNT(CL.Id)
FROM GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
ORDER BY 2 DESC
地理空間インデックスを設定しておらず、ShapeFilesのポイント数が多いため、年齢(20分など)がかかりますが、正常に実行されます。あなたが提案するように結果を制限したい場合:
SELECT G.Name, COUNT(CL.Id)
FROM GeoShapes G
INNER JOIN CrimeLocations CL ON G.ShapeFile.STIntersects(CL.LatLong) = 1
GROUP BY G.Name
HAVING COUNT(CL.Id) = 500
もちろん、数値500をハードコードしたくないので、そこに COUNT(*)FROM CrimeLocations
サブクエリ、または別のクエリからの合計を含む変数を追加できます。
これで十分ですか?