聚合随机
来自 PostgreSQL 维基
跳转到导航跳转到搜索随机值可以通过 random() 内置函数获取,但有时您需要从分组中获取一个随机元素。
random()
此代码片段允许您使用random()作为聚合函数。它也是 ulib_agg 用户定义库 的一部分。
它应该在分组中的每一行上均匀分布选择,无论选中的值是否为 NULL。(如果您想让它选择一个随机的非 NULL 元素,可以修改 SFUNC)
CREATE OR REPLACE function _final_random(anyarray)
RETURNS anyelement AS
$BODY$
SELECT $1[array_lower($1,1) + floor((1 + array_upper($1, 1) - array_lower($1, 1))*random())];
$BODY$
LANGUAGE 'sql' IMMUTABLE;
CREATE AGGREGATE random(anyelement) (
SFUNC=array_append, --Function to call for each row. Just builds the array
STYPE=anyarray,
FINALFUNC=_final_random, --Function to call after everything has been added to array
INITCOND='{}' --Initialize an empty array when starting
);
用法
SELECT random(x) AS array_of_randoms_from1_toX FROM t;