【问题标题】:To update several non dupliated rows at one time using "Group by"使用“分组依据”一次更新多个非重复行
【发布时间】:2012-01-09 16:52:26
【问题描述】:

我听从了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 表:有 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]中。

  • 费用将基于起点和起点之间的距离 端点。

要求:

  • 起点和终点的组合应该是唯一的。

  • 起点集包含表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;

【问题讨论】:

  • 问题到底是什么?
  • 我仍然没有看到一个措辞清晰的问题。您谈论的是points,但那些可能是integer 值。我们只是不知道 - 表 weighed_directed_edge 的定义丢失了。你使用了像covers all the points in points set which ranges in [1, 1001]. 这样的短语,这些短语在英语中是无法解析的......

标签: postgresql stored-procedures random postgis plpgsql


【解决方案1】:

在循环中,您可以绘制一个随机数并仅在它不存在时插入(并减少循环计数器)。 伪代码

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2016-11-18
    相关资源
    最近更新 更多