[pgsql-jp: 26874] Re: ランダムに並び替えて SELECTする

Yutaka tanida yutaka @ hi-net.zaq.ne.jp
2002年 8月 1日 (木) 18:45:54 JST


谷田です。

On Thu, 1 Aug 2002 18:19:09 +0900
"中島 学" <manabu_nakajima @ fmltd.co.jp> wrote:

> 連番を振った番号のカラムと、その内容のカラムがあったとします。
> 
> no   contents
> 1    A
> 2    B
> 3    C
> 4    D
> 
> これを
> 3    C
> 1    A
> 2    B
> 4    D
> などとして、ランダムにセレクトしたいのですが、何かいいアイデアありますでしょうか?
> order by no で並べ替える限り毎回同じになってしまいますよね。
> 
> JSPで結果をレコードセットでとるので、SQL側で並び替えできたらと思っています。

Javaでいけるのなら内部でListに保存してCollections#shuffle()とかのほうが
いいと思いますが・・・

ちなみに、PostgreSQLならではの奇妙な方法ですが、こんなのもあります。

select ... order by (oid * v1) % v2 ;

ここで

v1 : 適当な数(定数)
v2 : 適当な数(2からv2-1程度のランダムな数)

# ランダムでdescを付けるとなお良し。

全体の数にもよりますが、それ相応にランダムになると思います。

#なお、v1/v2はどんな値が適当なのかは今思いついたのでよく知りません。もし
分かったらぜひ報告してください。


Administrator=# create temp table t1 (i int,t text);
CREATE
Administrator=# insert into t1 values(1,'1');
INSERT 159637 1
Administrator=# insert into t1 values(2,'2');
INSERT 159638 1
Administrator=# insert into t1 values(3,'3');
INSERT 159639 1
Administrator=# insert into t1 values(4,'4');
INSERT 159640 1

Administrator=# select  * from t1 order by (oid*25)%3;
 i | t 
---+---
 3 | 3
 1 | 1
 4 | 4
 2 | 2
(4 rows)

Administrator=# select  * from t1 order by (oid*25)%5;
 i | t 
---+---
 1 | 1
 2 | 2
 3 | 3
 4 | 4
(4 rows)

Administrator=# select  * from t1 order by (oid*25)%7;
 i | t 
---+---
 1 | 1
 3 | 3
 2 | 2
 4 | 4
(4 rows)

Administrator=# select  * from t1 order by (oid*25)%9;
 i | t 
---+---
 1 | 1
 4 | 4
 3 | 3
 2 | 2
(4 rows)

Administrator=# select  * from t1 order by (oid*25)%10;
 i | t 
---+---
 2 | 2
 4 | 4
 1 | 1
 3 | 3
(4 rows)

-- 
Yutaka tanida <yutaka @ hi-net.zaq.ne.jp>




pgsql-jp メーリングリストの案内