2012-06-18 2 views
0

У меня около 53 миллионов строк в SQL Server2008 R2. Я хочу добавить столбец Direction. Значение для направления зависит от координат предыдущих строк, где выполняется простой расчет, чтобы установить изменение координат на уникальный идентификатор.Вставка значения, которое зависит от значения предыдущей записи

Как достичь этого с помощью SQL-скрипта и/или оператора?

+0

будет хорошо, если вы зададите свой вопрос четким и кратким .... – Tirumudi

+0

какая версия сервера sql? – paul

+0

SQL server2008R2 –

ответ

4

Что вы действительно хотите сделать, это использовать новые функции LAG и LEAD, но поскольку они доступны только в SQL Server 2012, вам нужно найти другой способ.

Существует сообщение в блоге здесь обсуждаются пять способов имитируют LAG и LEAD: http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-using-sql-server-2012-analytic-function/

1

Это требует автообъединение на столе, как я уверен, вы уже выяснили. Если ваш уникальный идентификатор не является последовательным, вам необходимо будет использовать функцию 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 
Смежные вопросы