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 | ...

根据要求,我需要允许以两种方式进行排序(根据用户请求):

1) ID 在连续父母中的随机顺序 - 这很容易实现

SELECT * FROM my_table ORDER BY parent_id, random()

2)随机排序的父母中ID的随机顺序 - 这就是我卡住的地方。显然,仅对整个事物进行排序random()不会很有用。

有什么建议么?理想情况下,在一个 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

如果它永远不会超过 100 条记录,那么只需选择所有记录,将其放置在本地表中(或客户端的内存数据结构中)并进行适当的Fisher-Yates shuffle即可。

于 2012-05-09T13:50:00.853 回答
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 回答