Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Problème de requête Sql 2008 - quel LatLong existe dans un polygone géographique?

En ce qui concerne vos "modifications", il est rare que vous voyiez une question qui inclut "veuillez ne pas fournir...". Assurément, chaque petit geste compte ? D'autant plus que vous ne nous avez pas montré ce que vous faites connaître STContains ou STIntersects (ou Filter() d'ailleurs)...

Quoi qu'il en soit, j'avais une base de données de codes postaux et d'emplacements de magasins à portée de main, j'ai donc renommé les tables/colonnes pour qu'elles correspondent aux vôtres (j'ai alors 6 535 CrimeLocatoins et 3 285 GeoShapes). Je suppose que vous l'avez compris maintenant - mais quelqu'un d'autre pourrait trouver cela utile...

La requête suivante renvoie le nombre de CrimeLocations dans chaque 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

Cela prend des heures (comme 20 minutes) parce que je n'ai pas configuré d'index géospatiaux et que mes ShapeFiles ont un nombre de points élevé, mais cela fonctionne avec succès. Si je voulais restreindre les résultats comme vous le suggérez :

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

Bien sûr, vous ne voulez pas coder en dur le nombre 500 - vous pouvez donc ajouter un COUNT(*) FROM CrimeLocations sous-requête ici, ou une variable avec le total d'une requête distincte.

Est-ce assez complexe ?