2011-11-30 11 views
0

我遵循Generate a random number of non duplicated random number in [0, 1001] through a loop的幫助。若要使用「分組方式」一次更新多個非重複行,請執行以下操作:

但我不能適用於我的情況。當我這樣做:

update weighed_directed_edge set endpoint= trunc(1000 * random()+ 1) 
from generate_series(1,10) group by 1 where startpoint= from_point; 

更新的EndpointId它抱怨:

ERROR: syntax error at or near "group" 
LINE 1: ...nc(1000 * random()+ 1) from generate_series(1,10) group by 1. 

我也試過:

insert into weighed_directed_edge (startpoint,endpoint) 
values (from_point, trunc((1000 * random()+ 1)) 
FROM generate_series(1, directed2number) 
GROUP BY 1 ; 

insert into weighed_directed_edge (startpoint, endpoint, costs) 
select 1, trunc(1000 * random()+ 1) from generate_series(1,10) group by 1,1; 

不工作。我需要從另一個表中設置的相同點中選擇起點和終點,以填充weighed_directed_edge表。

  • cross_point table:有1001個十字路口。

           Table "public.cross_point" 
        Column | Type |         Modifiers        
    --------------+---------+--------------------------------------------------------------------- 
    intersection | integer | not null default nextval ('intersection_intersection_seq'::regclass) 
    x_axis  | integer | not null 
    y_axis  | integer | not null 
    Indexes: 
        "intersection_pkey" PRIMARY KEY, btree (intersection) 
        "intersection_x_axis_key" UNIQUE, btree (x_axis, y_axis) 
    
  • weighed_directed_edge表:

     Table "public.weighed_directed_edge" 
         Column |  Type  | Modifiers 
        ------------+------------------+----------- 
        startpoint | integer   | 
        endpoint | integer   | 
        costs  | double precision | 
        Indexes: 
         "weighed_directed_edge_startpoint_key" UNIQUE, btree (startpoint, endpoint) 
        Foreign-key constraints: 
         "weighed_directed_edge_endpoint_fkey" FOREIGN KEY (endpoint) REFERENCES cross_point(intersection) 
         "weighed_directed_edge_startpoint_fkey" FOREIGN KEY (startpoint) REFERENCES cross_point(intersection) 
    
  • 的隨機數端點(從1001點列隨機得到)對應於每一個起始點(從柱依次點獲得),. 終點的數量在[1,7]。

  • 成本將基於起點和終點之間的距離。

要求:

  • 起始點和終點的組合應該是唯一的。

  • Startpoints集包含從表cross_point所有1001相交

  • 端點來全部來自同一交叉點集。

  • 每個星點最多有7個端點匹配,(7路道路交叉點最大),並且隨機選擇端點匹配數量。

我跳過下面的代碼成本計算:

--The largest number of intersection chosen is 7, but this could be altered 
create or replace function popluate_weighed_directed_edge() returns void as $$ 
declare 
from_point integer; 
to_point integer; 
directed2number integer; --the number of node this startpoint leads to 
counter integer; 
factor float; 
weight numeric; 
start_pointer record; 

begin 
for start_pointer in select * from cross_point 
loop 
from_point := start_pointer.intersection; 
    directed2number := trunc(Random()*7+1); 
    counter := directed2number; 
     while counter > 0 
     loop 
insert into weighed_directed_edge (startpoint) select from_point from generate_series(1,10) ; 
update weighed_directed_edge set endpoint= trunc(1000 * random()+ 1) from generate_series(1,10) group by 1 where startpoint= from_point ; 
update weighed_directed_edge set costs= trunc(1000 * random()+ 1) from generate_series(1,10) group by 1 where startpoint= from_point ; 
     counter := counter - 1; 
     end loop; 
end loop; 
end 
$$ language plpgsql; 
+0

究竟是什麼問題? – wildplasser

+0

我還沒有看到明確的措辭問題。你談論'points',但那些可能是'整數'值。我們只是不知道 - 表weighed_directed_edge的定義丟失了。你可以使用短語,例如'覆蓋範圍在[1,1001] .'中的所有點,不能用英語解析...... –

+0

我已經重新調整了它。 –

回答

1

在循環中,你可以畫一個隨機數,僅將其插入(和遞減循環計數器),如果它不存在。 Pseudocode

while (counter > 6) 
loop: 
    this = 1+ random() *1000 
    insert into weighed_directed_edge (startpoint, endpoint, costs) 
    VALUES (:frompoint, :this, xxx* random()) 
    WHERE NOT EXISTS (
    SELECT(*) FROM weighed_directed_edge nx 
    WHERE nx.startpoint = :frompoint 
    AND nx.endpoint = :this 
    ); 

    if (rowcount > 0) counter -= 1; 
end loop; 
相關問題