Postgres FOR LOOP

问题描述 投票:41回答:2

我试图从表中获取25个15,000个ID的随机样本。而不是每次都手动按下运行,我正在尝试循环。我完全理解的不是Postgres的最佳用法,但它是我的工具。这是我到目前为止:

for i in 1..25 LOOP
   insert into playtime.meta_random_sample
   select i, ID
   from   tbl
   order  by random() limit 15000
end loop
postgresql stored-procedures for-loop random plpgsql
2个回答
105
投票

Procedural elements like loops不是SQL语言的一部分,只能在过程语言functionprocedure(Postgres 11或更高版本)或DO语句的主体内使用,其中这些附加元素由相应的过程语言定义。默认值为PL/pgSQL,但there are others

plpgsql示例:

DO
$do$
BEGIN 
   FOR i IN 1..25 LOOP
      INSERT INTO playtime.meta_random_sample
         (col_i, col_id)                       -- declare target columns!
      SELECT  i,     id
      FROM   tbl
      ORDER  BY random()
      LIMIT  15000;
   END LOOP;
END
$do$;

对于可以通过循环解决的许多任务,有一个更短,更快的基于集合的解决方案。纯SQL等效于您的示例:

INSERT INTO playtime.meta_random_sample (col_i, col_id)
SELECT t.*
FROM   generate_series(1,25) i
CROSS  JOIN LATERAL (
   SELECT i, id
   FROM   tbl
   ORDER  BY random()
   LIMIT  15000
   ) t;

关于generate_series()

关于优化随机选择的性能:


0
投票

以下是您可以使用的示例:

create temp table test2 (
  id1  numeric,
  id2  numeric,
  id3  numeric,
  id4  numeric,
  id5  numeric,
  id6  numeric,
  id7  numeric,
  id8  numeric,
  id9  numeric,
  id10 numeric) 
with (oids = false);

do
$do$
declare
     i int;
begin
for  i in 1..100000
loop
    insert into test2  values (random(), i * random(), i / random(), i + random(), i * random(), i / random(), i + random(), i * random(), i / random(), i + random());
end loop;
end;
$do$;
© www.soinside.com 2019 - 2024. All rights reserved.