>  기사  >  컴퓨터 튜토리얼  >  테이블에서 레코드를 무작위로 선택하는 방법

테이블에서 레코드를 무작위로 선택하는 방법

WBOY
WBOY앞으로
2024-01-15 14:18:161223검색

테이블에서 레코드를 무작위로 선택하는 방법

테이블에서 데이터를 무작위로 선택하는 방법

테이블의 N개 데이터를 Oracle에서 무작위로 읽는 방법:

1) select * from (sys_guid()에 의한 테이블 이름 순서에서 * 선택) where rownum 2) select * from (dbms_random.value에 의한 테이블 이름 순서에서 * 선택) where rownum3) select * from (table_name에서 * 선택 샘플(10) order by trunc(dbms_random.value(0, 1000))) 여기서 rownum 설명:

sample(10)은 테이블에 있는 데이터의 10%를 검색한다는 의미입니다. 샘플 값은 [0.000001,99.999999] 사이여야 합니다. 여기서 sys_guid()와 dbms_random.value는 모두 내부 함수입니다

참고:

sys_guid() 메서드를 사용하면 때로는 동일한 레코드를 얻을 수 있습니다. 즉, 이전 쿼리의 결과 집합이 동일합니다. 이러한 상황은 운영 체제와 관련이 있을 수 있습니다. 예를 들어 Windows 시스템에서는 정상이고 Linux 시스템에서는 비정상입니다. 또한 sys_guid() 함수 자체에 문제가 있을 수 있어 추가적인 연구가 필요합니다.

다른 플랫폼에서 읽은 데이터가 무작위인지 확인하려면 두 가지 솔루션 2)와 3)을 채택하는 것이 좋습니다. 그 중 2) 솔루션이 더 일반적으로 사용되고 있으며, 3) 솔루션은 큰 테이블을 쿼리하고 많은 데이터를 추출하지 않는 경우에 적합하며 쿼리 속도를 향상시킬 수 있습니다.

대규모 데이터 세트에서 일부 레코드를 무작위로 추출하는 방법

테이블의 N개 데이터를 Oracle에서 무작위로 읽는 방법:

1

2

3

1) select * from (sys_guid()에 의한 테이블 이름 순서에서 * 선택) where rownum 2) select * from (dbms_random.value에 의한 테이블 이름 순서에서 * 선택) where rownum3) select * from (table_name에서 * 선택 샘플(10) trunc(dbms_random.value(0, 1000))) 기준으로 주문하세요. 여기서 rownum

설명:

sample(10)은 테이블에 있는 데이터의 10%를 검색한다는 의미입니다. 샘플 값은 [0.000001,99.999999] 사이여야 합니다. 여기서 sys_guid()와 dbms_random.value는 모두 내부 함수입니다

참고:

sys_guid() 메서드를 사용하면 때로는 동일한 레코드를 얻을 수 있습니다. 즉, 이전 쿼리의 결과 집합이 동일합니다. 이러한 상황은 운영 체제와 관련이 있을 수 있습니다. 예를 들어 Windows 시스템에서는 정상이고 Linux 시스템에서는 비정상입니다. 또한 sys_guid() 함수 자체에 문제가 있을 수 있어 추가적인 연구가 필요합니다.

다른 플랫폼에서 읽은 데이터가 무작위인지 확인하려면 2)와 3)의 두 가지 솔루션을 채택하는 것이 좋습니다. 그 중 2) 솔루션이 더 일반적으로 사용되고 있으며, 3) 솔루션은 큰 테이블을 쿼리하고 많은 데이터를 추출하지 않는 경우에 적합하며 쿼리 속도를 향상시킬 수 있습니다.

oracle 테이블에서 임의의 레코드를 쿼리하는 방법

요즘 작업의 필요성은 상대적으로 큰 테이블에서 레코드를 무작위로 검색하는 것입니다. MS SQLSERVER와 달리 Oracle은 Select TOP 1 * From TABLE Order By NewID()를 직접 사용하여 효율적으로 레코드를 검색할 수 있습니다. 많은 고민 끝에 900,000개의 레코드와 단 하나의 gameid 필드가 있는 테이블을 사용했습니다. 이 필드에는 테스트용으로 100000부터 999999까지의 일련의 데이터 레코드가 포함되어 있습니다.

방법 1.

rownum 및 dbms_random.value를 사용하면 평균 시간이 5초입니다. 이 효율성은 실제로 너무 낮습니다. 작은 테이블에는 괜찮지만 큰 테이블에는 적합하지 않습니다.

선언

n_id번호(6);

시작

게임 ID를 n_id FROM(SELECT gameid FROM t_id T ORDER BY dbms_random.value()) WHERE ROWNUM=1;

dbms_output.put_line(to_char(n_id));

끝;

/

방법 2.

oracle 샘플 구문을 사용하면 무작위 샘플을 1%로 설정하면 결과가 약 0.01이 되는데, 이는 상당히 빠른 속도입니다. 그러나 공식 웹사이트에 따르면 샘플 수집 기능을 사용하면 부정확한 결과 집합이 생성될 수 있습니다. 테스트 결과가 잘못되었습니다. 그런데 문제가 있는데, 무작위 결과의 분포가 매우 고르지 않고, 결과가 거의 모두 100000~200000개의 레코드에 저장된다는 것입니다. 효율성은 좋지만 좋은 무작위 효과를 얻지 못하면 결과가 그다지 높지 않으면 이 방법이 상당히 좋습니다.

선언

n_id번호(6);

시작

gameid를 n_id FROM t_id SAMPLE(1) WHERE ROWNUM = 1로 선택합니다.

dbms_output.put_line(to_char(n_id));

끝;

/

방법 3.

마이너스 구문을 사용하여 먼저 테이블의 전체 레코드 수 범위 내에서 무작위로 난수를 얻은 다음 rownum을 통해 레코드 차이가 1개만 있는 두 결과 세트를 쿼리하고 마이너스를 사용하여 난수가 있는 레코드를 뺍니다. 평균 시간은 약 1초입니다. 난수가 작을수록 쿼리 속도가 빨라집니다. 난수가 20000일 경우 0.016초가 걸립니다. 이 방법이기는 하지만

매우 무작위적인 효과를 얻을 수 있지만 방법 2만큼 효율성은 좋지 않습니다. 효율성이 평균이라면 그래도 사용을 고려해 볼 수 있습니다.

선언

n_count int:=0;

n_rand_num int:=0;

n_id번호(6);

시작

t_id에서 n_count로 COUNT(*) 선택;

SELECT trunc(dbms_random.value(1,n_count+1)) INTO n_rand_num FROM DUAL;

gameid를 n_id로 선택합니다(SELECT gameid FROM t_id T WHERE rownum 마이너스

t_id T WHERE rownum에서 gameid를 선택하세요. dbms_output.put_line(to_char(n_id));

끝;

/

위 내용은 테이블에서 레코드를 무작위로 선택하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 docexcel.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제