sql - 从双表中选择确切的行数

标签 sql oracle dual-table

任务如下:从双表中选择 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个数字,而不是更少?非常感谢!

最佳答案

使用行生成器生成所有数字;使用 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 行是唯一的 23 分之 4 的机会。将所有这些概率相乘:

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 - 可能但不太可能。

关于sql - 从双表中选择确切的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46033495/

相关文章:

mysql - SQL查询: combining data from two tables

java - JPA 2.1 - 无法调用 Oracle 函数

oracle - 重新创建 Oracle DUAL 表

sql - Oracle 12.2 中使用 BIND 变量和 OR 条件的 QUERY 的性能问题

sql - ORA-01841 : (full) year must be between -4713 and +9999, 且不为 0

SQL (Oracle) Select 没有包含静态数据的实际表

SQL:如何在忽略重复字段值的同时从表中选择行?

.net - 为 POINT postgresql 数据类型(或非原始类似 nhibernate 类型的任何 COLUMN)实现新的 NHibernate 类型

java - 有没有一种方法可以根据文本字段中输入的数据突出显示或为各个表行着色?