쿼리 결과에서 결과의 랜덤 샘플 선택
이 질문에서는 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
'source' 카테고리의 다른 글
| IOS에서 첫 번째 앱을 제출할 때 Xcode에서 번들 식별자 변경 (0) | 2023.05.20 |
|---|---|
| VB.NET의 유형 비교 (0) | 2023.05.20 |
| 'JSON'은 IE에서만 정의되지 않은 오류입니다. (0) | 2023.03.21 |
| WooCommerce 기본 암호 보안 수준 변경 (0) | 2023.03.21 |
| 확장자가 없는 파일을 워드프레스로 업로드하시겠습니까? (0) | 2023.03.21 |