[SQL] SQL 서버에서 하버 사인 식의 SQL 쿼리
SQLSQL 서버에서 하버 사인 식의 SQL 쿼리
나는 SQL 서버 2014 데이터베이스에서 특정 지역을 방문 드라이버를 얻기 위해 노력하고 있어요. 테이블은 DriverLocationHistory 지정됩니다.
저는 여기에 사용되는 SQL 쿼리는 다음과 같습니다
SELECT id, ( 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) )
* cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) ) ) AS distance
FROM DriverLocationHistory
HAVING distance < 5
ORDER BY distance
내가 쿼리를 실행하면이 오류를 얻을 :
Msg 207, Level 16, State 1, Line 7
Invalid column name 'distance'.
해결법
-
==============================
1.Where 절 당신은에 별칭을 사용할 수 없습니다. WHERE 절가 처리되기 전에, 또는, 결과 집합이 생성되고, 결과 집합이 생성 될 때까지 별명이 할당되지 않기 때문이다. 만 집계 처리하기 전에 다음 별명이 어떤 식의 값에 할당되어 있기 때문에 당신은이 작업을 수행 할 수 있습니다 (그룹에 의해가) 집계 쿼리한다. 귀하의 질의 절은 (HAVING 절 일 필요는 없습니다) 곳과 순서에 의해 모두에서 전체 표현을 사용해야합니다 :
Where 절 당신은에 별칭을 사용할 수 없습니다. WHERE 절가 처리되기 전에, 또는, 결과 집합이 생성되고, 결과 집합이 생성 될 때까지 별명이 할당되지 않기 때문이다. 만 집계 처리하기 전에 다음 별명이 어떤 식의 값에 할당되어 있기 때문에 당신은이 작업을 수행 할 수 있습니다 (그룹에 의해가) 집계 쿼리한다. 귀하의 질의 절은 (HAVING 절 일 필요는 없습니다) 곳과 순서에 의해 모두에서 전체 표현을 사용해야합니다 :
SELECT id, ( 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) ) * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) ) ) AS distance FROM DriverLocationHistory Where 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) ) * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) ) < 5 ORDER BY 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) ) * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) )
댓글에서 언급 한 바와 같이, 당신은에 의해 순서대로 별칭을 사용할 수 있습니다,
또는, 당신은 또한 하위 쿼리의 계산과 별칭 할당을 수행 할 수 있습니다 :
SELECT id, distance From (Select ( 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) ) * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) ) ) distance From DriverLocationHistory)z Where distance < 5 ORDER BY distance
-
==============================
2.나는이 작업을 수행 할 수있는 방법을 제공하도록 요청 받았다 내장 된 지리 데이터 타입. 즉, 그래서 여기에 코멘트를 너무 오래 조금의 이동 :
나는이 작업을 수행 할 수있는 방법을 제공하도록 요청 받았다 내장 된 지리 데이터 타입. 즉, 그래서 여기에 코멘트를 너무 오래 조금의 이동 :
ALTER TABLE [DriverLocationHistory] ADD geoLocation AS geography::Point([Latitude], [Longitude], 4236); declare @p geography = geography::Point(37, -122, 4236); select * from [DriverLocationHistory] where geoLocation.STDistance(@p) < 5000;
공간 인덱스는 선택의 where 절의 SARGability에 도움이 될 것이다.
from https://stackoverflow.com/questions/39338167/sql-query-of-haversine-formula-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 읽을 더 쉽게 잘 포맷 코드를 읽을 수있는 블록으로 SQL 문자열을 포맷하기 (0) | 2020.07.15 |
---|---|
[SQL] 동일한 ID를 갖는 행 테이블에서 컬럼을 사용하여 문자열 값을 형성하는 가장 좋은 방법이 무엇입니까? (0) | 2020.07.15 |
[SQL] SQL 쿼리는 값 목록에 여러 범위에 대한 일치하는 번호 목록을 번역하기 (0) | 2020.07.15 |
[SQL] 트리 구조의 모든 구성원을 찾기 (0) | 2020.07.15 |
[SQL] .NET 간단한 양식 AJAX와 JQUERY를 통해 제출 (0) | 2020.07.15 |