2017-06-06 12 views
1

私はPostgreSQL 9.5データベースに2つのカラムIDとジオメトリを持つテーブル(12行)を持っています。 PgAdmin3からテーブル構造である:PostgreSQLの下限と上限の更新

CREATE TABLE public.my_table 
(
id integer, 
geom geometry 
) 

形状はこれに1としてIDを有する真北から出発三角形を表します。各行のIDは一意です。つまり、1〜12です。このIDに基づいて、アングルとその下限と上限を更新しようとしています。私のアプローチは次のとおりです:

Select 
id, 
Case when id = 1 then 30 
     when id = 2 then 60 
     when id = 3 then 90 
     when id = 4 then 120 
     when id = 5 then 150 
     when id = 6 then 180 
     when id = 7 then 210 
     when id = 8 then 240 
     when id = 9 then 270 
     when id = 10 then 300 
     when id = 11 then 330 
     when id = 12 then 360 
end as angle, 
case when id = 1 then lower(numrange(0, 30)) 
     when id = 2 then lower(numrange(30, 60)) 
     when id = 3 then lower(numrange(60, 90)) 
     when id = 4 then lower(numrange(90, 120)) 
     when id = 5 then lower(numrange(120, 150)) 
     when id = 6 then lower(numrange(150, 180)) 
     when id = 7 then lower(numrange(180, 210)) 
     when id = 8 then lower(numrange(210, 240)) 
     when id = 9 then lower(numrange(240, 270)) 
     when id = 10 then lower(numrange(270, 300)) 
     when id = 11 then lower(numrange(300, 330)) 
     when id = 12 then lower(numrange(330, 360)) 
end as lb 
from my_table 

もっと良い方法がありますか?どのポインタも高く評価されます。

+0

投稿にテーブル定義を追加してください。 –

+0

@VaoTsun:編集をご覧ください。 pgAdmin3のテーブル構造を追加しました。 –

答えて

1

私はここでウィンドウ関数を使うと思っていましたが、その後私は、あなたがこのためにmy_tableから任意の列を必要としないことに気付きました。試してみてください:

は(あなたが明示的に最低の境界を定義する必要があることに注意してください、 - ここで私はゼロを使用)OPからノートを反映するためにを更新

t=# with p as (select id,angle from generate_series(30,360,30) with ordinality as g(angle,id)) select *,coalesce(lag(angle) over (order by id),0) lb from p; 
id | angle | lb 
----+-------+----- 
    1 | 30 | 0 
    2 | 60 | 30 
    3 | 90 | 60 
    4 | 120 | 90 
    5 | 150 | 120 
    6 | 180 | 150 
    7 | 210 | 180 
    8 | 240 | 210 
    9 | 270 | 240 
10 | 300 | 270 
11 | 330 | 300 
12 | 360 | 330 
(12 rows) 

私が使用したい更新 書き換えOPクエリウィンドウ関数のケースをリストすることを避けるためのCTE:

t=# with a as (Select 
id, 
Case when id = 1 then 30 
     when id = 2 then 60 
     when id = 3 then 90 
     when id = 4 then 120 
     when id = 5 then 150 
     when id = 6 then 180 
     when id = 7 then 210 
     when id = 8 then 240 
     when id = 9 then 270 
     when id = 10 then 300 
     when id = 11 then 330 
     when id = 12 then 360 
end as angle 
from my_table) 
select *,coalesce(lag(angle) over (order by id),0) 
from a; 
id | angle | coalesce 
----+-------+---------- 
    1 | 30 |  0 
    2 | 60 |  30 
    3 | 90 |  60 
    4 | 120 |  90 
    5 | 150 |  120 
    6 | 180 |  150 
    7 | 210 |  180 
    8 | 240 |  210 
    9 | 270 |  240 
10 | 300 |  270 
11 | 330 |  300 
12 | 360 |  330 
(12 rows) 

Time: 0.462 ms 
+0

これはうまくいきましたが、IDに基づいて三角形の下限と下限を生成するためにmy_tableを更新する必要があることに注意してください。だから私はIDのCASE文を使ったのです。あるいは、 "g"(あなたの提案したソリューション)とmy_tableの間で結合を行う必要があります。正しい? –

+0

おそらく、IDカラムの窓関数を使う方が良いでしょうか? –

+0

はい - 角度が30°まで成長していない場合は、ID値を角度値に結合してからlead()またはlag()を使用してください( –

関連する問題