4

我注意到 SQL Server 2008 的 MAX/MIN 聚合函数不能按预期使用负数。

我正在使用纬度和经度值(许多是负#s),我得到的结果似乎只看绝对值。

SELECT 
    MAX(g.Geo_Lat) AS MaxLat, MAX(g.Geo_Long) AS MaxLong,
    MIN(g.Geo_Lat) AS MinLat, MIN(g.Geo_Long) AS MinLong  
FROM Geolocations g

以下是查询结果:

MaxLat          MaxLong         MinLat        MinLong
38.3346412      -85.7667496     38.1579234    -85.5289429

请注意 maxlong 和 minlong 的结果不正确。

是否有一些解决方法(除了特殊的 UDF)?

4

2 回答 2

5

数据类型和排序规则确定顺序。

地理数据,例如存储为地理类型,可以与浮点值不同的排序 - 但在这种情况下,它们不会。地理类型是不可排序的,只有纬度和经度是可排序的,如您所显示的。但那些输出为浮点值。

您使用什么数据类型导致这种情况发生?经过一番测试,我终于弄明白了。对于地理数据或任何包含负数的数字类型,它将按预期工作。

您将纬度和经度存储为文本数据 - 不是吗?

将它们投射为花车。那将解决它。

于 2012-06-12T19:30:45.670 回答
3

Max 和 Min 聚合在 SQL Server 2008 中按预期工作。你能提供 Geolocations 表的列类型吗?

它确实取决于表中的位置。随着您获得越来越多的条目,它应该接近

MaxLat          MaxLong             MinLat           MinLong
90              180                 -90              -180
south pole      far west of        north pole       far east of 
                prime meridian                      prime meridian

本初子午线 0 度穿过英国伦敦。-180 和 180 是与 0 相对的同一条线。

如果您只有几行,请尝试将这些位置添加到您的表中:

insert into Geolocations (Geo_Lat, GeoLong) values(-180,-90)
insert into Geolocations (Geo_Lat, GeoLong) values(0,0)
insert into Geolocations (Geo_Lat, GeoLong) values(180,90)
于 2012-06-12T19:07:23.773 回答