Sql server SQL Server:正在查找最近的位置
如果下面的SQL返回基于给定城市的机场列表,我将如何进一步增强它,以按离我最近的机场对结果进行排序?这似乎应该足够简单,但我却无法理解Sql server SQL Server:正在查找最近的位置,sql-server,Sql Server,如果下面的SQL返回基于给定城市的机场列表,我将如何进一步增强它,以按离我最近的机场对结果进行排序?这似乎应该足够简单,但我却无法理解 DECLARE @latRange float DECLARE @LongRange float DECLARE @LowLatitude float DECLARE @HighLatitude float DECLARE @LowLongitude float DECLARE @HighLongitude float DECLARE @Radius float
DECLARE @latRange float
DECLARE @LongRange float
DECLARE @LowLatitude float
DECLARE @HighLatitude float
DECLARE @LowLongitude float
DECLARE @HighLongitude float
DECLARE @Radius float = 100
DECLARE @istartlat float
DECLARE @istartlong float
Select @istartlat=Latitude, @istartlong=Longitude from Lookup where PlaceName = '"Franklin"' and StateCode = '"AR"'
Select @latRange = @Radius / ((6076 / 5280) * 60)
Select @LongRange = @Radius / (((COS((@istartlat * 3.14592653589 / 180)) * 6076.) / 5280. * 60))
Select @LowLatitude = @istartlat - @latRange
Select @HighLatitude = @istartlat + @latRange
Select @LowLongitude = @istartlong - @LongRange
Select @HighLongitude = @istartlong + @LongRange
Select a.City, a.State, a.AirportCode, a.AirportName, a.CountryCode
from PFM_Airport a
where (a.Latitude <= @HighLatitude) and (a.Latitude >= @LowLatitude) and (a.Longitude >= @LowLongitude)
and (a.Longitude <= @HighLongitude)
--and a.CountryCode in ('USA', 'CANADA')
order by a.Latitude, a.Longitude;
@哈切特是对的。。假设您的SQL Server支持实例,那么您应该考虑使用该数据类型进行计算,也可以找到有用的部分代码,只需根据需要替换表名、条件和分页:
ALTER PROCEDURE [dbo].[SP_NearestPOIReloaded]
(
-- Add the parameters for the stored procedure here
@LAT float,
@LNG float,
@DISTANCE int,
@CURRENTPAGE Int,
@PAGESIZE Int,
@COUNT int OUTPUT
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
/*for pagination*/
SET @COUNT = (SELECT COUNT(*) FROM dbo.Lugares as [L] WHERE dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) < @DISTANCE)
/*paginated resultset*/
SELECT * FROM (
SELECT ROW_NUMBER()Over(Order by dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) Asc) As [RowNum], dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) as [distance], [L].*, [E].name as [empresaName], [U].userName as [userName]
FROM dbo.Lugares as [L], dbo.Empresas as [E], dbo.Usuarios as [U]
WHERE dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) < @DISTANCE AND
[L].usuarioId = [U].id AND [L].empresaId = [E].id
)
AS ResultadoPaginado
WHERE RowNum BETWEEN (@CURRENTPAGE - 1) * @PAGESIZE + 1 AND @CURRENTPAGE * @PAGESIZE
END
@哈切特是对的。。假设您的SQL Server支持实例,那么您应该考虑使用该数据类型进行计算,也可以找到有用的部分代码,只需根据需要替换表名、条件和分页:
ALTER PROCEDURE [dbo].[SP_NearestPOIReloaded]
(
-- Add the parameters for the stored procedure here
@LAT float,
@LNG float,
@DISTANCE int,
@CURRENTPAGE Int,
@PAGESIZE Int,
@COUNT int OUTPUT
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
/*for pagination*/
SET @COUNT = (SELECT COUNT(*) FROM dbo.Lugares as [L] WHERE dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) < @DISTANCE)
/*paginated resultset*/
SELECT * FROM (
SELECT ROW_NUMBER()Over(Order by dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) Asc) As [RowNum], dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) as [distance], [L].*, [E].name as [empresaName], [U].userName as [userName]
FROM dbo.Lugares as [L], dbo.Empresas as [E], dbo.Usuarios as [U]
WHERE dbo.DistanceBetween(@LAT, @LNG, [L].lat, [L].lng) < @DISTANCE AND
[L].usuarioId = [U].id AND [L].empresaId = [E].id
)
AS ResultadoPaginado
WHERE RowNum BETWEEN (@CURRENTPAGE - 1) * @PAGESIZE + 1 AND @CURRENTPAGE * @PAGESIZE
END
我将如何进一步增强它,以便按离我最近的内容对结果进行排序
我认为在SQL Server 2000中,要对计算值进行排序,必须在ORDER BY子句ORDER BY select FOO.a, FOO.b, FOO.myvalue
from
(
select a, b, <some calculation> as myvalue
from T
where <some calculation> <= {some value}
) as FOO
order by FOO.myvalue
但在SQL的更高版本中,您可以根据列别名进行排序
在任何情况下,您都必须有一列来包含计算的距离。我如何进一步增强它,以便按离我最近的内容对结果进行排序
我认为在SQL Server 2000中,要对计算值进行排序,必须在ORDER BY子句ORDER BY select FOO.a, FOO.b, FOO.myvalue
from
(
select a, b, <some calculation> as myvalue
from T
where <some calculation> <= {some value}
) as FOO
order by FOO.myvalue
但在SQL的更高版本中,您可以根据列别名进行排序
在任何情况下,都必须有一列来包含计算的距离。SQL有一个pi常量。你真的不需要硬编码,除非您有意将其四舍五入到特定值。您的SQL Server版本是否支持地理空间数据类型?目前,lat和long存储为浮动。您的距离通常足够小,机场也足够南,因此您的经度范围近似值不会给加拿大北部带来不正确的结果机场与真正的大圈距离相比?距离最大为100英里SQL有一个pi常数。你真的不需要硬编码,除非您有意将其四舍五入到特定值。您的SQL Server版本是否支持地理空间数据类型?目前,lat和long存储为浮动。您的距离通常足够小,机场也足够南,因此您的经度范围近似值不会给加拿大北部带来不正确的结果机场与真正的大圈距离相反?距离最大为100英里如果OP没有内置的地理功能可用,他们可以使用此sql UDF:如果OP没有内置的地理功能可用,他们可以使用此sql UDF: