[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 メーリングリストの案内