테이블에서 랜덤하게 row 선택하기... 1 6 2,248

by 구경꾼 [SQL Query] [2023.02.27 20:35:59]


다량의 데이터를 생성하기 위해 coonect by level 기능을 사용하려하는데

잘 안되는 부분이 있습니다. 예를 들면..

 

with temp as (
          select 1 temp_no, 'A' temp_nm, 'AA' temp_desc from dual
          union all
          select 2 temp_no, 'B' temp_nm, 'BB' temp_desc from dual
          union all
          select 3 temp_no, 'C' temp_nm, 'CC' temp_desc from dual
          union all
          select 4 temp_no, 'D' temp_nm, 'DD' temp_desc from dual
          union all
          select 5 temp_no, 'E' temp_nm, 'EE' temp_desc from dual
)
select 
     rownum,
     (select temp_no from (select temp_no from temp order by dbms_random.random) where rownum <= 1) temp_no
from dual
connect by level <= 10;

 

위 쿼리에서 connect by level이 없는 상태에서는 랜덤하게 row가 select되는데

connect by level을 걸면 의도와 다르게 모든 값이 동일하게 표시되네요.

혹시 다른 방법이 있을련지 궁금합니다.
          

by 뉴비디비 [2023.02.27 22:04:04]
-- 작성하신 쿼리는 정해진 temp_no 값이 10번 들어가서 동일한 값이 될껀데. 의도 하시는게 temp_no 가 매번 다른 랜덤값인가요?

WITH temp AS (
          select 1 temp_no, 'A' temp_nm, 'AA' temp_desc from dual
          union all
          select 2 temp_no, 'B' temp_nm, 'BB' temp_desc from dual
          union all
          select 3 temp_no, 'C' temp_nm, 'CC' temp_desc from dual
          union all
          select 4 temp_no, 'D' temp_nm, 'DD' temp_desc from dual
          union all
          select 5 temp_no, 'E' temp_nm, 'EE' temp_desc from dual
)
SELECT
    ROWNUM
   , ROUND(DBMS_RANDOM.VALUE() * (SELECT MAX(temp_no)-1 FROM temp)) + 1 temp_no
FROM dual
CONNECT BY LEVEL <= 10;

by 마농 [2023.02.28 00:08:53]

원하는 자료에 대한 구체적인 설명과 결과 예시자료가 필요합니다.


by 구경꾼 [2023.02.28 08:35:45]

답변 감사드리고..설명이 부족했나 봅니다.

테이블에서 랜덤하게 하나의 row를 select하기 위해 order by dbms_random.random을 사용했습니다.

여기까지는 문제가 없습니다.

다량의 랜덤 row를 취하기 위해서는 loop를 돌려야하는데 성능 문제로 connect by level로 해결하려 했는데

처음 랜덤하게 추출된 row 값이 반복 출력됩니다.

혹시 방법이 있을까 싶어 질문 글 남깁니다.

 


by 마농 [2023.02.28 08:48:30]

위 예시에는 원본이 5개인데? 출력은 10개네요?
원본보다 많이 출력하나요? 이게 맞나요? 그게 아니라면? 원본은 몇건 정도 있는지?
출력은 10개 고정인지? 출력건수가 가변이라면? 어느정도 범위인지?


by 구경꾼 [2023.02.28 09:41:39]

실제 업무에서는 원본은 100개 남짓되는 코드 테이블이고 여기서 5만여건의 테스트 데이터를 만들려고 합니다.

루프는 안 돌려봤지만 성능이 나오지 않을 것 같아 다른 방법을 찾아보고 있는데 여의치 않네요.

 

 


by 마농 [2023.02.28 09:54:05]
-- temp_no 가 숫자(1~100) 이라고 가정하면
SELECT FLOOR(dbms_random.value(1, 101)) temp_no
  FROM dual
 CONNECT BY ROWNUM <= 50000
;

그런데. 렌덤 돌려도 5만건 정도 되면 균등하게 분포됩니다.(500건 언저리)
균둥 분포를 원하는 건가요? 그럴꺼면 굳이 랜덤이 필요할지? 그냥 500건씩 복제하면 되는데요.
불균등 분포를 원한다면 전략을 세워야 할 것입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입