Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Problema di query Sql 2008:quale LatLong esiste in un poligono geografico?

Per quanto riguarda le tue "modifiche", non capita spesso di vedere una domanda che include "per favore non fornire...". Sicuramente ogni piccolo aiuto? Soprattutto dal momento che in realtà non ci hai mostrato cosa fai conoscere STContains o STIntersects (o Filter() del resto)...

Ad ogni modo, avevo un database di codici postali e posizioni dei negozi a portata di mano, quindi ho rinominato le tabelle/colonne in modo che corrispondano alle tue (poi ho 6.535 CrimeLocatoins e 3.285 GeoShapes). Presumo che tu l'abbia già capito, ma qualcun altro potrebbe trovarlo utile...

La query seguente restituisce il numero di CrimeLocations in ogni GeoShapes.ShapeFile

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

Ci vogliono anni (come 20 minuti) perché non ho impostato alcun indice geospaziale e i miei ShapeFiles hanno un conteggio di punti elevato, ma funziona correttamente. Se volessi limitare i risultati come suggerisci:

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

Ovviamente non vuoi codificare il numero 500, quindi puoi aggiungere un COUNT(*) FROM CrimeLocations sottoquery lì, o una variabile con il totale da una query separata.

È abbastanza complesso?