Select dual table 中的确切行数
Select exact number of rows from dual table
任务如下:select 20 行来自 dual table,随机生成从 23 到 45 的不同数字。
我执行了以下操作:
select distinct floor(dbms_random.value(23,45)) output
from dual
connect by rownum <= 20;
但是它select的随机行数小于20。例如:
OUTPUT
44
35
25
27
40
32
26
36
43
34
31
33
37
13 rows selected.
请帮忙,如何select恰好20个数字,而不是更少?非常感谢!
使用行生成器生成所有数字;使用 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 之间的随机整数,然后然后 DISTINCT
子句将删除所有重复项,您很可能会有重复项,这会将最终行数减少到 20 以下。
从数学上讲,它生成的第一行将是唯一的,然后第二行有 22 分之 23 的机会是唯一的,并且如果前面的行是唯一的,那么第三行有 23 分之 21 的机会是独特且...第 20 行有 4 分之 23 的机会是独特的。将所有这些概率相乘:
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;
给出您将使用您的方法生成所有 20 行的概率 0.0000025
- 可能但不太可能。
任务如下:select 20 行来自 dual table,随机生成从 23 到 45 的不同数字。
我执行了以下操作:
select distinct floor(dbms_random.value(23,45)) output
from dual
connect by rownum <= 20;
但是它select的随机行数小于20。例如:
OUTPUT
44
35
25
27
40
32
26
36
43
34
31
33
37
13 rows selected.
请帮忙,如何select恰好20个数字,而不是更少?非常感谢!
使用行生成器生成所有数字;使用 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 之间的随机整数,然后然后 DISTINCT
子句将删除所有重复项,您很可能会有重复项,这会将最终行数减少到 20 以下。
从数学上讲,它生成的第一行将是唯一的,然后第二行有 22 分之 23 的机会是唯一的,并且如果前面的行是唯一的,那么第三行有 23 分之 21 的机会是独特且...第 20 行有 4 分之 23 的机会是独特的。将所有这些概率相乘:
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;
给出您将使用您的方法生成所有 20 行的概率 0.0000025
- 可能但不太可能。