Domanda

Ho le seguenti due tabelle: -

GeoShapes

  • GeoShapeId INT IDENTITY
  • Nome VARCHAR (100)
  • ShapeFile GEOGRAPHY [questo è un poligono chiuso di Lat / Longs]

CrimeLocations

  • CrimeLocationId INT IDENTITY
  • LatLong GEOGRAPHY [questo è un Lat / Long Point]

Ora ho circa 10K risultati GeoShape e circa 500CrimeLocations.

Sto cercando di capire quali GeoShapes esistono tutti e 500 i punti lat / long di crimine all'interno di.

:( Non capisco! Stavo provando a fare un STIntersects su una subquery ma non ha funzionato. Qualche suggerimento?

evviva!

MODIFICA 1: Non posso usare alcuna funzione GEOMETRIA .. perché (come detto sopra) questi sono tutti tipi di geografia.

EDIT 2: so come usare STContains e STIntersects . Si prega di non fornire esempi di base di ciò. Sono più curioso di fare una query complessa con la mia struttura di tabella, sopra.

È stato utile?

Soluzione

Per quanto riguarda le tue "modifiche", non capita spesso di vedere una domanda che include " per favore non fornire ... " ;. Sicuramente ogni piccolo aiuto? In particolare dal momento che non ci hai effettivamente mostrato ciò che fai su STContains o STIntersects (o Filter () del resto) ...

Comunque, avevo a portata di mano un database di zipcode e storelocations, quindi ho rinominato le tabelle / colonne in modo che corrispondessero alle vostre (ho quindi 6.535 CrimeLocatoins e 3.285 GeoShapes). Presumo che tu l'abbia capito ormai - ma qualcun altro potrebbe trovarlo utile ...

La seguente query 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 età (come 20 minuti) perché non ho impostato alcun indice geospaziale e i miei ShapeFile hanno un conteggio 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 una sottoquery COUNT (*) FROM CrimeLocations o una variabile con il totale da una query separata.

È abbastanza complesso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top