code

쿼리 결과에서 임의의 결과 샘플 선택

codestyles 2020. 12. 14. 08:12
반응형

쿼리 결과에서 임의의 결과 샘플 선택


이 질문 은 SQL Server에서 임의의 (ish) 레코드 샘플을 가져 오는 것에 대해 묻습니다 TABLESAMPLE. 대답은를 사용하는 것 입니다. Oracle 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 개의 행을 원한다면 해당 숫자를 조정해야합니다. 더 자주 나는 어쨌든 임의의 수의 행이 필요하므로 결과를 제한하지 않습니다. 2 백만 개의 행이있는 데이터베이스에서 2 초 대 60 초를 얻습니다.

select * from mytable sample (0.01)

SELECT * FROM TABLE_NAME SAMPLE(1)

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

이것이 사실이면 표본 크기의 실제 분포는 이항입니다.


I know this has already been answered, but seeing so many visits here I'd like to add one version that uses the SAMPLE clause but still allows to filter the rows first:

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

Note however that the base select needs a ROWID column, which means it may not work for some views for example.


Sample function is used for sample data in ORACLE. So you can try like this:-

SELECT * FROM TABLE_NAME SAMPLE(50);

Here 50 is the percentage of data contained by the table. So if you want 1000 rows from 100000. You can execute a query like:

SELECT * FROM TABLE_NAME SAMPLE(1);

Hope this can help you.


Something like this should work:

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 );

We were given and assignment to select only two records from the list of agents..i.e 2 random records for each agent over the span of a week etc.... and below is what we got and it works

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;

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

반응형