복붙노트

[SQL] SQL 서버에서 하버 사인 식의 SQL 쿼리

SQL

SQL 서버에서 하버 사인 식의 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. ==============================

    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. ==============================

    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에 도움이 될 것이다.

  3. from https://stackoverflow.com/questions/39338167/sql-query-of-haversine-formula-in-sql-server by cc-by-sa and MIT license