source

Oracle 쿼리의 각 행에 난수 생성

lovecheck 2023. 2. 9. 22:47
반응형

Oracle 쿼리의 각 행에 난수 생성

테이블의 모든 행을 선택한 후 1~9 사이의 난수를 선택합니다.

select t.*, (select dbms_random.value(1,9) num from dual) as RandomNumber
from myTable t

그러나 난수는 행마다 동일하며 쿼리 실행마다 다를 뿐입니다.같은 실행에서 행마다 숫자를 다르게 하려면 어떻게 해야 합니까?

뭐 그런 거?

select t.*, round(dbms_random.value() * 8) + 1 from foo t;

편집: David은 이것이 1과 9에 불균일한 분포를 가져온다고 지적했습니다.

그가 지적한 바와 같이, 다음 사항이 더 나은 분포를 제공합니다.

select t.*, floor(dbms_random.value(1, 10)) from foo t;

처음에는 이게 효과가 있을 줄 알았어요.

select DBMS_Random.Value(1,9) output
from   ...

단, 출력값의 균등분포는 생성되지 않습니다.

select output,
       count(*)
from   (
       select round(dbms_random.value(1,9)) output
       from   dual
       connect by level <= 1000000)
group by output
order by 1

1   62423
2   125302
3   125038
4   125207
5   124892
6   124235
7   124832
8   125514
9   62557

내 생각에 그 이유는 꽤 명백하다.

다음과 같은 것을 사용하는 것이 좋습니다.

floor(dbms_random.value(1,10))

이 때문에,

select output,
       count(*)
from   (
       select floor(dbms_random.value(1,10)) output
       from   dual
       connect by level <= 1000000)
group by output
order by 1

1   111038
2   110912
3   111155
4   111125
5   111084
6   111328
7   110873
8   111532
9   110953

필요 없다select … from dual, 다음과 같이 적어주세요.

SELECT t.*, dbms_random.value(1,9) RandomNumber
  FROM myTable t

라운드만 사용하면 두 끝 번호(1과 9)의 빈도가 낮아지고 1과 9 사이의 정수 분포를 얻을 수 있습니다.

SELECT MOD(Round(DBMS_RANDOM.Value(1, 99)), 9) + 1 FROM DUAL

언급URL : https://stackoverflow.com/questions/1568630/generating-random-number-in-each-row-in-oracle-query

반응형