sql >> Databáze >  >> RDS >> Sqlserver

Výpočet vzdálenosti s obrovskou databází SQL Server

Mohli byste udělat horší věci, než se dívat na GEOGRAPHY datový typ, například:

CREATE TABLE Places
(
    SeqID       INT IDENTITY(1,1),
    Place       NVARCHAR(20),
    Location    GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
    CROSS JOIN Places p2
GO  
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
    FROM Places p1
        INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO  

geography::Point bere zeměpisnou šířku a délku a také SRID (Special Reference ID number). V tomto případě je SRID 4326, což je standardní zeměpisná šířka a délka. Protože již máte zeměpisnou šířku a délku, stačí ALTER TABLE přidejte sloupec geografie a poté UPDATE k jeho osídlení.

Ukázal jsem dva způsoby, jak dostat data z tabulky, ale nemůžete s tím vytvořit indexované zobrazení (indexované pohledy nemohou mít vlastní spojení). Mohli byste však vytvořit sekundární tabulku, která je ve skutečnosti mezipamětí, která je naplněna na základě výše uvedeného. Pak se musíte starat o jeho údržbu (může to být provedeno pomocí spouštěčů nebo jiného procesu).

Všimněte si, že křížové spojení vám dá 250 000 000 000 řádků, ale vyhledávání je jednoduché, protože se stačí podívat na jeden ze sloupců míst (tj. SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100 , druhý vám poskytne výrazně méně řádků, ale dotaz pak musí vzít v úvahu sloupce Místo1 i Místo2).




  1. Jak napíšu příkaz if else ve výrazovém jazyce Reporting Services?

  2. chyba při instalaci mysqlclient pomocí pip do MacOS Bigsur

  3. PostgreSQL:Jak vrátit dynamické řádky z tabulky bez použití seznamu definic sloupců?

  4. Konvence pojmenovávání databází od společnosti Microsoft?