0

データが次のように見えるテーブルがあります。

ID | PARENT_ID | several_columns_to_follow
---+-----------+--------------------------
 1 |         1 | some data
 2 |         2 | ...
 3 |         1 | ...
 4 |         4 | ...
 5 |         3 | ...
 6 |         1 | ...
 7 |         2 | ...
 8 |         3 | ...

要件ごとに、(ユーザーの要求ごとに) 2 つの方法で並べ替えを許可する必要があります。

1) 連続した親内の ID のランダムな順序 - これは次の方法で簡単に実現できます

SELECT * FROM my_table ORDER BY parent_id, random()

2) ランダムにソートされた親内の ID のランダムな順序 - これが私が立ち往生している場所です。明らかに、すべてを並べ替えるだけではrandom()あまり役に立ちません。

助言がありますか?理想的には 1 つの SQL ステートメントですが、必要に応じて複数の SQL ステートメントを使用することもできます。データの量は多くないので、パフォーマンスについては心配していません (最終結果で約 100 行を超えることはありません)。

4

4 に答える 4

0

random()本当に最終的な並べ替えでは厄介な関数です。ほぼランダムで十分な場合は、行の値のハッシュアップされた関数で並べ替えることができます。

SELECT * FROM my_table 
ORDER BY parent_id, (id *12345) % 54321
     ;
于 2012-05-09T13:15:17.547 に答える
0

たぶんこれでうまくいくでしょう:

ORDER BY ((parent_id * date_part('microseconds', NOW()) :: Integer) % 123456),
((id * date_part('microseconds', NOW()) :: Integer) % 123456);

123456 の代わりに素数を使用すると、「よりランダムな」結果が得られる可能性があります

于 2012-05-09T13:28:14.810 に答える
0

このような何かがそれを行う必要があります:

WITH r AS (SELECT id, random() as rand FROM my_table ORDER BY rand)
SELECT m.* FROM r JOIN my_table m USING (id)
  ORDER BY r.rand, random();
于 2012-05-09T16:04:17.077 に答える