gpt4 book ai didi

sql - where 子句中的奇怪随机行为

转载 作者:行者123 更新时间:2023-12-03 12:10:36 24 4
gpt4 key购买 nike

我有一张这样的 table :

     Id | GroupId | Category
------------------------
1 | 101 | A
2 | 101 | B
3 | 101 | C
4 | 103 | B
5 | 103 | D
6 | 103 | A
........................

我需要选择 GroupId 之一随机。为此,我使用了以下 PL/SQL 代码块:
declare v_group_count number;
v_group_id number;
begin
select count(distinct GroupId) into v_group_count from MyTable;
SELECT GroupId into v_group_id FROM
(
SELECT GroupId, ROWNUM RN FROM
(SELECT DISTINCT GroupId FROM MyTable)
)
WHERE RN=Round(dbms_random.value(1, v_group_count));
end;

因为我将随机值四舍五入,所以它将是一个整数值, WHERE RN=Round(dbms_random.value(1, v_group_count))条件必须始终返回一行。一般来说,它给了我一排正如预期的那样。 但奇怪的是,有时它没有给我任何行,有时它返回两行。 这就是为什么它在本节中给出错误:
SELECT GroupId into v_group_id

有人知道这种行为的原因吗?

最佳答案

round(dbms_random.value(1, v_group_count))正在为每一行执行,因此可能会选择或不选择每一行。

附:
ROUND 是一个糟糕的选择。
获得任何边缘值(例如 1 和 10)的概率是获得任何其他值(例如 2 到 9)的概率的一半。
它是 0.0555... (1/18) 比。 0.111... (1/9)

[  1,1.5) --> 1
[1.5,2.5) --> 2
.
.
.
[8.5,9.5) --> 9
[9.5, 10) --> 10
select          n,count(*)
from (select round(dbms_random.value(1, 10)) as n
from dual
connect by level <= 100000
)
group by n
order by n
;

    N   COUNT(*)
1 5488
2 11239
3 11236
4 10981
5 11205
6 11114
7 11211
8 11048
9 10959
10 5519
我的建议是在 dbms_random.value(1,N+1) 上使用 FLOOR
    select          n,count(*)
from (select floor(dbms_random.value(1, 11)) as n
from dual
connect by level <= 100000
)
group by n
order by n
;

N   COUNT(*)
1 10091
2 10020
3 10020
4 10021
5 9908
6 10036
7 10054
8 9997
9 9846
10 10007

关于sql - where 子句中的奇怪随机行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40610396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com