source

쿼리 결과에서 결과의 랜덤 샘플 선택

bestscript 2023. 3. 21. 22:16

쿼리 결과에서 결과의 랜덤 샘플 선택

질문에서는 SQL Server에서 레코드의 랜덤 샘플 취득에 대해 질문합니다.답변은 다음과 같습니다.TABLESAMPLEOracle 10에 동등한 기능이 있습니까?

존재하지 않는 경우 쿼리 세트에서 랜덤 샘플 결과를 얻을 수 있는 표준 방법이 있습니까?예를 들어, 보통 수백만 개를 반환하는 쿼리로부터 1,000개의 랜덤 행을 얻을 수 있는 방법은 무엇입니까?

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000

SAMPLE 절은 테이블 내의 모든 행에 대한 랜덤 샘플 백분율을 제공합니다.

예를 들어, 여기서는 행의 25%를 얻습니다.

SELECT * FROM emp SAMPLE(25)

다음 SQL(분석 함수 중 하나 사용)은 테이블에서 특정 값(GROUP BY와 유사)의 각 발생 횟수의 랜덤 샘플을 제공합니다.

다음은 각각 10개의 샘플입니다.

SELECT * FROM (
SELECT job, sal, ROW_NUMBER()
OVER (
PARTITION BY job ORDER BY job
) SampleCount FROM emp
)
WHERE SampleCount <= 10

이것은 완벽한 답은 아니지만 훨씬 더 나은 성능을 얻을 수 있을 것입니다.

SELECT  *
FROM    (
    SELECT  *
    FROM    mytable sample (0.01)
    ORDER BY
            dbms_random.value
    )
WHERE rownum <= 1000

샘플은 실제 표의 퍼센트를 나타내며, 1000 행을 원하는 경우 이 값을 조정해야 합니다.결과를 제한하지 않기 위해 임의의 수의 행이 필요한 경우가 많습니다.200만 행의 데이터베이스에서는 60초가 아닌 2초가 할당됩니다.

select * from mytable sample (0.01)
SELECT * FROM TABLE_NAME SAMPLE(1)

관측치 수의 정확히 1/100이 아닌 약 1%의 점유율을 제공합니다.Oracle이 생성하는 샘플에 포함시킬지 여부에 대해 각 관찰에 대해 랜덤 플래그를 생성하기 때문일 수 있습니다.이러한 생성 과정의 인수 1(1%)은 각 관측치가 표본으로 선택될 확률의 역할을 합니다.

이 값이 참이면 표본 크기의 실제 분포는 이항 분포가 됩니다.

이미 답변이 끝난 것은 알고 있습니다만, 많은 방문이 있는 것을 보면, SAMPLE 절을 사용하면서도 행을 먼저 필터링할 수 있는 버전을 하나 추가하고 싶습니다.

with cte1 as (
    select *
    from t_your_table
    where your_column = 'ABC'
)
select * from cte1 sample (5)

단, 기본선택에는ROWID예를 들어 일부 보기에서는 작동하지 않을 수 있습니다.

샘플 함수는 ORACLE의 샘플 데이터에 사용됩니다.다음과 같이 시도해 볼 수 있습니다.

SELECT * FROM TABLE_NAME SAMPLE(50);

여기서 50은 테이블에 포함된 데이터의 백분율입니다.100000에서 1000 행을 원하는 경우.다음과 같은 쿼리를 실행할 수 있습니다.

SELECT * FROM TABLE_NAME SAMPLE(1);

이게 도움이 되길 바라.

다음과 같은 것이 동작합니다.

SELECT * 
FROM table_name
WHERE primary_key IN (SELECT primary_key 
                      FROM
                      (
                        SELECT primary_key, SYS.DBMS_RANDOM.RANDOM 
                        FROM table_name 
                        ORDER BY 2
                      )
                      WHERE rownum <= 10 );

에이전트 리스트에서 2개의 레코드만 선택하도록 지시받았습니다.즉, 1주일 동안 각 에이전트에 대해 2개의 랜덤 레코드 등입니다.다음은 저희가 얻은 레코드로 동작합니다.

with summary as (
Select Dbms_Random.Random As Ran_Number,
             colmn1,
             colm2,
             colm3
             Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank
    From table1, table2
 Where Table1.Id = Table2.Id
 Order By Dbms_Random.Random Asc)
Select tab1.col2,
             tab1.col4,
             tab1.col5,
    From Summary s
 Where s.Rank <= 2;

에서 1,하려고 한다고 가정해당 행은 1,000개입니다.my_table은 다음과 같습니다 이치노

select
    *
from
    (
        select
            row_number() over(order by dbms_random.value) as random_id,
            x.*
        from
            my_table x
    )
where
    random_id <= 1000
;

이는 @Quassnoi가 올린 답변에서 약간 벗어난 것입니다.둘 다 비용과 실행 시간이 동일합니다.유일한 차이점은 표본을 가져오는 데 사용할 난수를 선택할 수 있다는 것입니다.

언급URL : https://stackoverflow.com/questions/733652/select-a-random-sample-of-results-from-a-query-result