任务如下:从双表中选择20行,随机生成从23到45的不同数字。
我执行了以下操作:
select distinct floor(dbms_random.value(23,45)) output
from dual
connect by rownum <= 20;
但它选择小于20的随机行数。例如:
OUTPUT
44
35
25
27
40
32
26
36
43
34
31
33
37
13 rows selected.
请帮忙,如何准确选择20个数字,而不是更少?非常感谢!
答案 0 :(得分:3)
使用行生成器生成所有数字;使用DBMS_RANDOM.VALUE
随机排序,然后获取前20行:
SELECT OUTPUT
FROM (
SELECT 22 + LEVEL AS OUTPUT
FROM DUAL
CONNECT BY 22 + LEVEL <= 45
ORDER BY DBMS_RANDOM.VALUE
)
WHERE ROWNUM <= 20
为什么您的代码不起作用:
您正在使用的代码可能会随机生成20个不同的数字,但很可能它不会生成20行23到45之间的随机整数,然后 {{1} }子句将删除所有重复项,您可能会有重复项,这将减少20以下的最终行数。
在数学上,它生成的第一行将是唯一的,然后第二行是唯一的,并且,如果先前的行是唯一的,那么第二行中的第二行是唯一的,并且第二行是唯一的。 ......排名第23的机会,第20排是独一无二的。将所有这些概率相乘:
DISTINCT
使用您的方法生成所有20行的概率SELECT probabilities ( number_of_rows, probability ) AS (
SELECT 1, 1 FROM DUAL
UNION ALL
SELECT number_of_rows + 1, probability * ( 23 - number_of_rows ) / 23
FROM probabilities
WHERE number_of_rows < 20
)
SELECT * FROM probabilities;
- 可能但不太可能。