从双表中选择确切的行数

Posted

技术标签:

【中文标题】从双表中选择确切的行数【英文标题】:Select exact number of rows from dual table 【发布时间】:2017-09-04 08:52:21 【问题描述】:

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

【问题讨论】:

您正在使用 select distinct,这是摆脱随机函数生成的重复项。它在 2 个值之间生成 20 个随机数,有些是重复的。 MT0 的解决方案生成 2 个值之间的所有数字,然后随机选择其中的 20 个,不重复。 现在我看到了逻辑,tks 澄清 【参考方案1】:

使用行生成器生成所有数字;使用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-in-23 的机会第二行是唯一的,并且鉴于前面的行是唯一的,21-in-23 的机会第三行是唯一的并且...第 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;

给出0.0000025 的概率,您将使用您的方法生成所有 20 行 - 可能但不太可能。

【讨论】:

谢谢!它解决了我的问题。顺便说一句,您知道为什么我的代码不起作用吗?非常感谢您的回答。 @mr.kalvados 更新了您的代码不起作用(可靠)的原因。

以上是关于从双表中选择确切的行数的主要内容,如果未能解决你的问题,请参考以下文章

此时确保 HBase 表中的行数增加的最有效方法是啥?

“确切的提取返回超过请求的行数”

jQuery:计算表中的行数

Node.js:计算文件中的行数

使用 Dask 从 CSV 文件中采样确切的行数

如何使用 apache poi 确定合并单元格中的行数?