表中SQL行的概率相等

表中SQL行的概率相等,sql,postgresql,Sql,Postgresql,我有一个表xyz,其中有5行。而且,我有一个函数,它将xyz表中的一行随机排序返回给用户,然后用户向其中添加建议。因此,建议的数量增加了 表xyz如下所示 id | suggestions ----------+-------------- 276 | 0 111 | 0 222 | 0 333 | 0 444 | 0 我现

我有一个表
xyz
,其中有5行。而且,我有一个函数,它将
xyz
表中的一行随机排序返回给用户,然后用户向其中添加建议。因此,建议的数量增加了

xyz
如下所示

 id       | suggestions 
----------+--------------
 276      |        0   
 111      |        0   
 222      |        0   
 333      |        0   
 444      |        0 
我现在拥有的简单函数是这样的

 SELECT * FROM xyz
 ORDER BY RANDOM()
id       | suggestions 
----------+--------------
 276      |        3   
 111      |        3   
 222      |        3   
 333      |        3   
 444      |        3 
 .....
id       | suggestions 
----------+--------------
 276      |        1   
 111      |        0   
 222      |        5   
 333      |        6   
 444      |        3 
 .....
但我的目标是在所有行上获得至少3个
建议
,然后任何行都可以有任意数量的
建议
。因此,如果每次都能以相同的概率随机选择
一行
,那么这项工作就可以完成。因此,在前5个实例中,将选择表中的一行,并且一旦选择了所有行,则该过程将以所有行的相同概率再次重复

我不想要的是-一行建议4,但其他行建议少于3

所以,如果函数被调用15次,我希望它是这样的

 SELECT * FROM xyz
 ORDER BY RANDOM()
id       | suggestions 
----------+--------------
 276      |        3   
 111      |        3   
 222      |        3   
 333      |        3   
 444      |        3 
 .....
id       | suggestions 
----------+--------------
 276      |        1   
 111      |        0   
 222      |        5   
 333      |        6   
 444      |        3 
 .....
但不是这样

 SELECT * FROM xyz
 ORDER BY RANDOM()
id       | suggestions 
----------+--------------
 276      |        3   
 111      |        3   
 222      |        3   
 333      |        3   
 444      |        3 
 .....
id       | suggestions 
----------+--------------
 276      |        1   
 111      |        0   
 222      |        5   
 333      |        6   
 444      |        3 
 .....

只需先按
建议
下订单,然后按
随机()下订单
。这将随机选择建议数少于其他行的行

在下面的示例中,select查询随机选择行,其中建议数为2,因为它是表中最小的

架构和插入语句:

 create table xyz (id int, suggestions int);
 INSERT into xyz VALUES ( 276    ,     2 );
 INSERT into xyz VALUES ( 111    ,     2 );
 INSERT into xyz VALUES ( 222    ,     3 );
 INSERT into xyz VALUES ( 333    ,     3 );
 INSERT into xyz VALUES ( 444    ,     3 );
首先选择查询:

 SELECT *  FROM xyz
  ORDER BY SUGGESTIONS, RANDOM()
输出:

身份证件 建议 111 2. 276 2. 222 3. 444 3. 333 3.
我和卡齐·穆罕默德·阿里·努尔的想法相同,但我会使用降序法


我正在使用Oracle并在上创建以下脚本。我使用
floor(dbms_random.value(1,10))
作为随机函数,并使用
其中rownum更改了我的答案。它现在正在工作。没错,但有一次失败了。如果4行有1个建议,1行有0个建议。如果10个不同的用户同时调用该函数,那么所有用户都会得到相同的第一行0条建议,然后第一行会有10条建议?不是吗?我们能以每行相等的概率随机化吗?我们能以每行相等的概率随机化吗?那是真的。你能提出克服这个问题的理论吗?我可以尝试将其转换为sql。@Shas。并发用户不是您所问问题的一部分。这回答了你提出的问题。我建议您提出一个新问题,重点是线程安全代码,如果这是您想要的。提示:你不能只通过
select
查询来完成。这是一个很好的问题。谢谢