2016-09-20 2 views
1

Я пытаюсь вычислить угол линий, чтобы отобразить их направление в визуализации. Тем не менее, я зациклился на том, как автоматически вычислить его как представление базы данных с помощью оператора SQL select.SQL: вычислить поле на основе последовательности

Расчет основан на нескольких критериях:

  1. Угол формула INT (градусы (ATAN2 (х2-х1, у2-у1))), где x2 = х из той же строке, и х1 = х предыдущей строки в соответствии с полем последовательности. Первая из последовательности будет NULL, так как перед ней нет x, y.
  2. Расчет производится в пределах каждого уникального значения «Линия»
  3. , когда Direction = 1, последовательность начинается от наименьшего до наибольшего значения. Однако, когда Direction = 2, последовательность начинается от самого большого до самого маленького.

enter image description here

Вот образец данных:

Line,Direction,Sequence,Y,X 
Line 1,1,1,1.37707996,103.9108531 
Line 1,1,1.2,1.37765002,103.9118526 
Line 1,1,4.5,1.37849998,103.912852 
Line 1,1,6.2,1.37914002,103.9138515 
Line 1,1,8,1.37959003,103.9148509 
Line 1,1,11.1,1.37978005,103.9148509 
Line 1,1,13.1,1.38031006,103.9158504 
Line 2,2,1.1,1.29593003,103.8761495 
Line 2,2,2.4,1.29744005,103.8771489 
Line 2,2,5.5,1.29849005,103.8771489 
Line 2,2,8.1,1.29954004,103.8781484 
Line 2,2,10,1.30094004,103.8781484 
Line 2,2,11.1,1.30155003,103.8781484 
Line 2,2,13.1,1.30234003,103.8781484 
Line 2,2,15.1,1.30338001,103.8781484 
Line 2,2,16.6,1.30410004,103.8781484 

Любые указатели? Спасибо.

ответ

1

Может быть что-то вроде этого ...

SQL> create table angle ( 
     line varchar(10), direction integer, sequence float, 
     y float, x float) ; 
SQL> select degrees(atan2(
      x - lag(x) over(order by sequence), 
      y - lag(y) over(order by sequence) 
    ))::integer from angle ; 

EDIT

Чтобы инвертировать порядок следования при направлении не "1":

SQL> select case when direction = 1 then 
       degrees(atan2(x-lag(x) over(order by sequence), 
       y-lag(y) over(order by sequence)))::integer 
      else 
       degrees(atan2(x-lag(x) over(order by sequence desc), 
       y-lag(y) over(order by sequence desc)))::integer 
      end 
    from angle ; 
+0

Благодаря Mauro! u предоставил некоторый свет на разрешение. Но как я должен анализировать утверждение для вычисления на основе каждой уникальной строки, и когда изменение направления на «2» нужно будет заменить на последовательность? – Jake

+0

Итак ... вы имеете в виду «порядок по порядку desc», когда direction = 2, ок? Просто ... редактирование решения .. – mauro

+0

Не забудьте понять это требование «уникальной стоимости линии». В электронной таблице Excel вы вычисляете угол для каждой строки. Вы хотите рассчитать угол только для строк Excel 2-3 и 9-10? – mauro

Смежные вопросы