2016-09-20 77 views
1

我试图计算直线的角度以在可视化中显示其方向。但是,我坚持如何通过使用SQL select语句将其自动计算为数据库视图。SQL:根据序列计算字段

计算是基于几个标准:

  1. 角式是INT(度(ATAN2(X2-X1,Y2-Y1))),其中同一行的X2 = X,且X 1 = X根据序列字段的前一行。序列中的第一个将为NULL,因为在它之前没有x,y。
  2. 计算在每个唯一的“行”值内完成
  3. 当方向= 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 ; 

编辑

要反向排列顺序时,方向不是 “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

感谢毛罗!你提出了一些解决方案。但是,我应该如何解析语句以便根据每条唯一的行进行计算,并且当方向改变为“2”时,序列将需要交换? – Jake

+0

所以......你的意思是“顺序排序”,当方向= 2时,好吗?轻松...编辑解决方案.. – mauro

+0

不确定要了解这种“独特的行值”要求。在您的Excel电子表格中,您可以计算每条线的角度。你是否想仅为Excel行号2-3和9-10计算角度? – mauro