作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从表中获取 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;
关于优化随机选择的性能:
关于postgresql - Postgres FOR 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19145761/
我是一名优秀的程序员,十分优秀!