聚合随机

来自 PostgreSQL 维基
跳转到导航跳转到搜索

随机值可以通过 random() 内置函数获取,但有时您需要从分组中获取一个随机元素。

random()

代码片段

聚合随机

适用于 PostgreSQL

任何版本

SQL

依赖于


此代码片段允许您使用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;