首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql中使用分组的随机排序

postgresql中使用分组的随机排序
EN

Stack Overflow用户
提问于 2012-05-09 20:51:59
回答 4查看 327关注 0票数 0

我有一个表,其中的数据可能如下所示:

代码语言:javascript
复制
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的随机顺序-这很容易通过以下方式实现

代码语言:javascript
复制
SELECT * FROM my_table ORDER BY parent_id, random()

2)在随机排序的双亲中ID的随机顺序-这就是我被卡住的地方。显然,仅仅根据random()对整个事件进行排序并不是很有用。

有什么建议吗?理想情况下,使用一条SQL语句,但如果需要,我愿意使用多条SQL语句。数据量并不大,所以我并不担心性能(最终结果中的行数永远不会超过100行)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-09 21:28:15

也许这样就行了:

代码语言:javascript
复制
ORDER BY ((parent_id * date_part('microseconds', NOW()) :: Integer) % 123456),
((id * date_part('microseconds', NOW()) :: Integer) % 123456);

也许质数而不是123456会产生“更随机”的结果

票数 0
EN

Stack Overflow用户

发布于 2012-05-09 21:15:18

在最后的排序中,random()确实是一个令人讨厌的函数。如果几乎随机就足够好了,也许您可以对行值的一些散列函数进行排序,比如

代码语言:javascript
复制
SELECT * FROM my_table 
ORDER BY parent_id, (id *12345) % 54321
     ;
票数 0
EN

Stack Overflow用户

发布于 2012-05-09 21:50:01

如果它永远不会超过100条记录,那么选择所有记录,将其放在本地表(或客户端的内存数据结构中)中,然后执行一次适当的Fisher-Yates shuffle可能是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10516537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档