2012-04-12 5 views
3

Ich benutze SQL Server und erstelle ein Skript, das den geografischen Standort des Arbeiters aus meiner Datenbank holt. Das Skript ist unten.SQL Geography-Datentypspalte in der GROUP BY-Klausel

SELECT w.display_name, w.geo_location 
FROM jobs j WITH(NOLOCK) 
INNER JOIN workers w WITH(NOLOCK) ON w.worker_id = j.worker_id 
WHERE ..... 

Das Problem ist, dass ich GROUP BY w.display_name, w.geo_location an das Skript hinzugefügt werden soll, da es doppelte Datensätze sind dargestellt ist. Eine Spalte mit dem Datentyp geography zu einer group by-Klausel hat zur Folge, dass ein Fehler ausgelöst wird.

Der Fehler ausgelöst wird, wenn ich hinzufügen, das in ist:

Der Typ „Geographie“ ist nicht vergleichbar. Es kann nicht in der GROUP BY-Klausel verwendet werden.

Gibt es einen Weg um dies? Ich kann w.geo_location nicht zu einem VARCHAR konvertieren, wie es in dem Geographie-Datentyp benötigt wird.

Antwort

4

Sie können row_number() so etwas verwenden.

declare @g geography; 
set @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326); 

declare @T table 
(display_name varchar(10), geo_location geography) 

insert into @T values ('1', @g) 
insert into @T values ('1', @g) 
insert into @T values ('1', @g) 

insert into @T values ('2', @g) 
insert into @T values ('2', @g) 

select display_name, geo_location 
from 
    (
    select *, 
      row_number() over(partition by display_name, geo_location.ToString() order by (select 0)) as rn 
    from @T 
) as T 
where rn = 1 

Ergebnis:

display_name geo_location 
------------ -------------------------------------------------------------------------------- 
1   0xE610000001148716D9CEF7D34740D7A3703D0A975EC08716D9CEF7D34740CBA145B6F3955EC0 
2   0xE610000001148716D9CEF7D34740D7A3703D0A975EC08716D9CEF7D34740CBA145B6F3955EC0 
4

Wenn Sie die Gruppe von Syntax verwenden, um weiterhin können Sie die Geo-Spalte konvertieren wieder in Text und zurück:

SELECT w.display_name, geography::STGeomFromText(w.geo_location.STAsText(), 4326) as Location 
FROM jobs j WITH(NOLOCK) 
INNER JOIN workers w WITH(NOLOCK) ON w.worker_id = j.worker_id 
WHERE ..... 
GROUP BY w.display_name, w.geo_location.STAsText()