0

SQL Server2008 R2 には約 5,300 万行あります。という列を追加したいと思いますDirection。方向の値は、一意の識別子ごとの座標の変化を確立するために単純な計算が行われる前の行の座標に依存します。

SQL スクリプトやステートメントを使用してこれを達成するにはどうすればよいですか?

4

2 に答える 2

4

本当にやりたいことは、新しい関数LAGLEAD関数を使用することですが、これらは SQL Server 2012 でのみ使用できるため、別の方法を見つける必要があります。

シミュレートする 5 つの方法について説明しているブログ投稿がここにありLAGますLEADusing-sql-server-2012-analytic-function/

于 2012-06-18T09:54:38.490 に答える
1

これには、テーブルでの自己結合が必要です。既に理解されていると思います。一意の識別子が連続していない場合は、ROW_NUMBER関数を使用して連続した行番号を作成する必要があります。それ以外の場合は、一意の識別子を使用できます。

これは私のテストテーブルです。コンテキストを提供するためだけに...

CREATE TABLE #test(
    test_key INT PRIMARY KEY CLUSTERED,
    lat float,
    lon float,
    direction float
)

主キーが連続していない場合は、ユーザーにする必要がありますROW_NUMBER。このシナリオの例を次に示します。北から時計回りの角度で方向を取得しようとしていると思います。ATN2は東から反時計回りに方位を返すので、X 座標と Y 座標を交換して基準を北に移動し、結果を否定して方向を修正しました。これにより、かなり有利なスタートが切れるはずです。ただし、この例lonlatと結果directionはすべてラジアンであることに注意してください。2 番目の例で行ったように、おそらくこれらを度数に変換する必要があります。

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY test_key) AS seq, test_key, lat, lon, direction FROM #test)
UPDATE t SET direction = -ATN2(c2.lon-c1.lon, c2.lat-c1.lat)
FROM #test t, cte c1, cte c2 
WHERE t.test_key = c1.test_key
AND c2.seq = c1.seq + 1

2 番目の例では、連続した主キー、および方向、緯度と経度 (度単位) を想定しています。

UPDATE t1 SET direction = -ATN2((t2.lon-t1.lon)*pi()/180.0, (t2.lat-t1.lat)*pi()/180.0)*180.0/pi()
FROM #test t1, #test t2
WHERE t2.seq = t1.seq + 1
于 2012-06-18T16:02:59.023 に答える