2016-09-20 100 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