postgresql - Postgres FOR 循环

标签 postgresql stored-procedures for-loop random plpgsql

我正在尝试从表中获取 15,000 个 ID 的 25 个随机样本。我不是每次都手动按运行,而是尝试循环。我完全理解这不是 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

最佳答案

Procedural elements like loops不是 SQL 语言的一部分,只能在过程语言的主体内使用 function , procedure (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() :

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

关于postgresql - Postgres FOR 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19145761/

相关文章:

c++ - 从列表/vector 创建嵌套 for 循环的最佳方法是什么?

r - for 循环与 cor.test 在许多类别上

ruby-on-rails - 在 Rails 5 中运行迁移后,外键未正确更新

c - PostgreSQL Type 1 接口(interface)和 ImageMagick 代码 - 冲突的 StringInfo 定义?

mysql - 我希望当没有选择过滤器时返回所有带有计数的数据

mysql - SQL存储过程未知错误

sql - 使用 order by 时在大表上查询速度慢

python - psycopg - 将 gzipped 数据插入 bytea 列

sql - 如何返回 SQL Server 存储过程的计算(聚合)结果

java - 对照另一个数组列表检查数组列表