表中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
查询来完成。这是一个很好的问题。谢谢