1

元の投稿:整数を浮動小数点に変更し、小数点を追加します

これが裏話です。私は車両から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

(これは正しい走行距離ではありませんが、結果として私が探しているものの単なる例です。)

4

1 に答える 1

2

タンプテーブル、テーブル変数、CTEの違いに注意してください。

現在、共通テーブル式(CTE)を使用しています。これらは、派生テーブルに直接続く1つのselect(または挿入、更新など)ステートメントにのみ使用できるためです(ただし、複数のテーブルを宣言できます)。あなたが行ったように、ステートメントのCTE)。

そのため、2番目のselectステートメントに到達するまでに、CTEは範囲外になり、CTEを参照できなくなります(または再度宣言する必要があります)。この場合、テーブル変数または一時テーブルを使用することをお勧めします。

次のようにCTE定義を変換することで、一時テーブルを簡単に作成できます。

-- Make a temp table
SELECT *
INTO #TempTableName -- Create a new temp table
FROM AVL 
WHERE DATE_TIME between '01/30/2013 00:00:00' AND '01/30/2013 23:59:59'
    AND radio_name = 'MAS7'

-- Check out our new temp table
SELECT * FROM #TempTableName

-- Clean up our temp table, though this will automatically happen once the connection is dropped
DROP TABLE #TempTableName

また、一時テーブルを操作するときは、次のようなものを使用して、プロシージャの最初と最後でそれらをチェックしてドロップすることがよくあります。

if object_id('tempdb..#TempTableName') is not null begin
    drop table #TempTableName
end

コードにこのようなものが含まれているので、実際の距離計算を実行するのが難しい場合はお知らせください。

于 2013-02-01T21:35:46.180 に答える