SQL

ORACLE ROW_NUMBER() OVER ( PARTITION BY ORDER BY DBMS_RANDOM.RANDOM )

sooyeoon 2023. 4. 26. 17:23

랜덤추출 시 특정 컬럼을 기준으로 각 한개씩만 추출하기 위한 목적으로 사용

 

부서별로 각 한명씩만 랜덤으로 추출하는 쿼리를 작성하기 위해 DISTINCT 나 GROUP BY를 사용했지만 적용되지 않았고 

GROUP BY 이후 HAVING 절로 ROWNUM 을 적용하지 못했는데,

SELECT 절에 ROW_NUMBER()로 특정 컬럼에 대한 값을 한 개씩 가져올 수 있었다.

 

SELECT EMPNO,EMPNM, RN, DEPTNM
FROM (
SELECT EMPNO, EMPNM, DEPTNM, 
ROW_NUMBER() OVER ( PARTITION BY DEPTNM ORDER BY DBMS_RANDOM.RANDOM ) AS rn
FROM
(SELECT A.EMPNO, A.EMPNM, B.DEPTNM 
FROM A, B, C, D
WHERE A.EMPNO = C.EMPNO
AND B.DEPT_CODE = D.DEPT_CODE) 
ORDER BY DBMS_RANDOM.RANDOM()
)
WHERE  rn = 1
AND ROWNUM<=10;

RN 컬럼과 함께 출력해보면 각 컬럼당 첫 번째 값( rn =1 )만 가져온 것을 확인할 수 있다.

* 참고 링크

https://stackoverflow.com/questions/49668354/oracle-sql-how-to-select-having-distinct-columns

 

Oracle SQL, how to select * having distinct columns

I want to have a query something like this (this doesn't work!) select * from foo where rownum < 10 having distinct bar Meaning I want to select all columns from ten random rows with distinct ...

stackoverflow.com