これが裏話です。私は車両からGPS座標を受信するデータベースを使用しており、経度と緯度の値に基づいてそれらの車両の走行距離を把握する必要があります。ただし、データベースでは、経度/緯度の両方の列が「整数/非ヌル」であり、小数点以下の桁数はありません。したがって、次のようになります。
Latitude Longitude
36158500 115949833
36340000 115914667
36153488 115944875
そして私はそれがこのように見える必要があります:
Latitude Longitude
36.158500 115.949833
36.340000 115.914667
36.153488 115.944875
Tim Lehnerの助けを借りて、小数点を取得する方法を理解しましたが、マイレージを計算するためにすでに作成した式を使用することはできません。各車両の走行距離を個別に確認できるように、radio_nameに基づいてlong / lat値を検索できる必要があります。そのため、CTEおよびCTE2という一時テーブルを作成しました。ただし、一時テーブルを呼び出すと、無効なオブジェクトであると表示されるため、コードは機能しません。以下の最後のステートメントでCTE2を使用するのではなく、「AVL」(元のテーブルの名前)をプラグインすると、コードは正常に機能するようになりました。ただし、マイレージは新しい緯度/経度の値を使用して計算されません。
要約すると、列は緯度、経度です。これらの列を変換して、緯度が2文字、経度が3文字の後に小数点を配置する必要があります。次に、指定された緯度と経度の値の間のマイレージを計算するMilesという名前の列が必要です。
ヒント、ヘルプ、ポインタなどはすべて大歓迎です!ありがとうございました!
USE [system]
GO
With CTE as
(SELECT * FROM AVL
WHERE (DATE_TIME between '01/30/2013 00:00:00' AND
'01/30/2013 23:59:59') AND radio_name = 'MAS7'),
CTE2 as
(select *,row_number() over(partition by Vehicle_ID order by Date_Time) as RN
FROM CTE)
SELECT *, sqrt((69.1*(previous.Latitude - next.Latitude))*
(69.1*(previous.Latitude-next.Latitude)) +
(69.1*(previous.Longitude-next.Longitude)) *
cos(next.Latitude/57.3) * (69.1*(previous.longitude-next.Longitude)) *
cos(next.Latitude/57.3)) as Miles
From CTE2 as Previous
Join CTE2 as Next
On previous.Vehicle_ID = Next.Vehicle_ID
AND Previous.RN =
Next.RN - 1
select cast(Latitude / 1000000.0 as decimal(10, 6)) as Latitude
, cast(Longitude / 1000000.0 as decimal(10, 6)) as Longitude
from cte2
****編集****
望ましい結果は次のようになります。
Latitude Longitude Mileage Radio_Name
36.158500 115.949833 3.444 MAS7
36.340000 115.914667 3.443 MAS7
36.153488 115.944875 4.544 MAS7
(これは正しい走行距離ではありませんが、結果として私が探しているものの単なる例です。)