我有一个表,其中的数据可能如下所示:
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语句,但如果需要,我愿意使用多条SQL语句。数据量并不大,所以我并不担心性能(最终结果中的行数永远不会超过100行)。
发布于 2012-05-09 21:28:15
也许这样就行了:
ORDER BY ((parent_id * date_part('microseconds', NOW()) :: Integer) % 123456),
((id * date_part('microseconds', NOW()) :: Integer) % 123456);也许质数而不是123456会产生“更随机”的结果
发布于 2012-05-09 21:15:18
在最后的排序中,random()确实是一个令人讨厌的函数。如果几乎随机就足够好了,也许您可以对行值的一些散列函数进行排序,比如
SELECT * FROM my_table
ORDER BY parent_id, (id *12345) % 54321
;发布于 2012-05-09 21:50:01
如果它永远不会超过100条记录,那么选择所有记录,将其放在本地表(或客户端的内存数据结构中)中,然后执行一次适当的Fisher-Yates shuffle可能是有意义的。
https://stackoverflow.com/questions/10516537
复制相似问题