2020년 11월 24일 화요일

MSSQL - RAND(), NEWID(), RANK(), ROW_NUMBER()


1. SQL SERVER에서 랜덤값을 만드는 방법



RAND()


RAND() 함수는 무작위 값을 반환.

ex) 0.9382734723487234


언제나 소수점을 포함한 무작위 값을 반환하기 때문에 정수값이 필요한 경우 ROUND() 함수와 함께 사용하는 것이 좋습니다.


SELECT ROUND(RAND() * 100, 0)





2. row별 랜덤값을 만드는 방법


RAND() 함수는 단일 랜덤값을 반환.


10개의 행이 있는 테이블에서


SELECT *, rand()

FROM

TABLENAME


를 실행 해 보면 rand 필드는 모두 같은 값을 반환.

rand 함수의 인자에 newid를 포함시켜 주면 행 별로 각각 다른 랜덤값을 조회할 수 있습니다.


SELECT RAND(cast(NEWID() AS varbinary))



(예) order by (case when 필드_SEQUENCE is null then convert(int,RAND(cast(NEWID() AS varbinary)) * 100000) else 필드_SEQUENCE end) asc





3. 중복을 제거한 랭킹을 만드는 방법 (동일 순위 있음)


다음은 랜덤값 -> 랭킹을 구하는 방법.

랭킹 정보를 조회할 때는 중복 포함/제외 여부에서 난이도가 결정 되는데요, 먼저 중복을 포함한 랭킹을 구하는 방법 입니다.



RANK()


RANK()는 랭킹(등수) 정보를 반환.


SELECT *, RANK() OVER (ORDER BY 필드이름 ASC) AS RankOrder

FROM TABLENAME


ORDER BY 필드에 동일한 값이 여러개 존재하는 경우 1등, 2등/2등/2등, 5등 으로 중복되는 순서를 건너 뜁니다.

중복되는 순서를 모두 출력하고 싶은 경우에는 DENSE_RANK 함수를 사용 합니다.






4. 중복을 완전 제거한 랭킹을 만드는 방법 (동일 순위 없음)


마지막으로 중복을 완전 제거한 랜덤값을 만드는 방법.






3. 중복을 제거한 랭킹을 만드는 방법과의 차이점은 정렬 기준이 같은 경우에도 유일한 값을 지정하는 것 입니다.


중복을 완전 제거한 랜덤값을 만들기 위해서는 ROW_NUMBER() 함수와 RANK() 함수를 적절히 응용해야 합니다.


SELECT *, ROW_NUMBER() OVER (ORDER BY round(RAND(cast(newid() as varbinary) * 1000000 ), 0))AS RankOrder

FROM TABLENAME





댓글 없음:

댓글 쓰기

javascript - SQL 예약어 제거

  <script language="javascript"> //특수문자, 특정문자열(sql예약어) 제거 function checkSearchedWord(obj){ obj.value = obj.value+&quo...