Aggregate Random

From PostgreSQL wiki

Revision as of 15:05, 19 May 2012 by Boshomi (Talk | contribs)

Jump to: navigation, search


Aggregate Random

Works with PostgreSQL

Any version

Written in


Depends on


By Daniel Kahn Gillmor (dkg)

Sometimes, you want a random element from a grouping. This snippet allows you to use RANDOM() as an aggregate function. It should distribute the choices uniformly over each row in the grouping, whether the value selected is NULL or not. (you could modify SFUNC if you wanted to have it select a random non-NULL element)

CREATE OR REPLACE FUNCTION _final_random(anyarray)           
 RETURNS anyelement AS
 SELECT $1[array_lower($1,1) + FLOOR((1 + array_upper($1, 1) - array_lower($1, 1))*random())];
CREATE AGGREGATE random(anyelement) (
  SFUNC=array_append, --Function to call for each row. Just builds the array
  FINALFUNC=_final_random, --Function to call after everything has been added to array
  INITCOND='{}' --Initialize an empty array when starting
Personal tools