Re: [HACKERS] RE: [SQL] random tuple
От | Thomas G. Lockhart |
---|---|
Тема | Re: [HACKERS] RE: [SQL] random tuple |
Дата | |
Msg-id | 361D948B.9612C41C@alumni.caltech.edu обсуждение исходный текст |
Ответ на | RE: [SQL] random tuple ("Jackson, DeJuan" <djackson@cpsgroup.com>) |
Список | pgsql-hackers |
> > >> Is there any way to select a random row from a table? > > > I'd look at using cursors and random(). > > Do you (or someone else) know how to use the following > > PostgreSQL functions: oidrand(oid,int4) ,oidsrand(int4)? > oidsrand(int4) -- seeds the random number generator for oidrand > oidrand(oid, int4) -- returns a psudo-random oid The regression test uses oidrand(), which is where I stumbled across it. The behavior is that oidrand() returns a boolean true/false with an inverse probability specified by the second argument. For example, given a table t with 100 entries, and the query select * from t where oidrand(oid, 10) will return, on average, 10 (10%) of the entries at random. The function is called 100 times in the course of the query, and uses random() or something similar to decide whether to return true or false for any particular instance. select * from t where oidrand(oid, 1) will, on average, return all entries (1/1 = 100%). select * from t where oidrand(oid, 100) will, on average, return 1 entry (1/100 = 1%) so sometimes will return one, zero, or two entries, and occasionally return more than two entries. It's pretty random, probably with a Poisson distribution depending on what you are asking for. Presumably oidsrand() allows one to change the seed to keep the pseudo-random results from repeating from one run to the next. But I haven't looked into it. - Tom
В списке pgsql-hackers по дате отправления: