Это требует автообъединение на столе, как я уверен, вы уже выяснили. Если ваш уникальный идентификатор не является последовательным, вам необходимо будет использовать функцию ROW_NUMBER
для создания последовательного номера строки, иначе вы можете использовать уникальный идентификатор.
Это моя тестовая таблица, просто чтобы дать вам контекст ...
CREATE TABLE #test(
test_key INT PRIMARY KEY CLUSTERED,
lat float,
lon float,
direction float
)
Если первичный ключ не является последовательным, вам нужно пользователю ROW_NUMBER
. Вот пример этого сценария. Я предположил, что вы пытаетесь получить направление в терминах градусов, расположенных по часовой стрелке от Севера. ATN2
вернет подшипник подшипника против часовой стрелки с востока, поэтому я поменял координаты X и Y, чтобы переместить основание на север, и отрицал результат, чтобы исправить направление. Это должно дать вам неплохое начало. Однако обратите внимание, что в этом примере lon
, lat
и итоговые direction
находятся в радианах. Вероятно, вам нужно будет преобразовать их в градусы, как я сделал во втором примере.
;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
Второй пример предполагает последовательный первичный ключ и направление, lat и lon в градусах.
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
будет хорошо, если вы зададите свой вопрос четким и кратким .... – Tirumudi
какая версия сервера sql? – paul
SQL server2008R2 –