postgresql random 함수를 알아봅시다.

코딩/Sql 2022. 7. 22. 00:40

  안녕하세요. 이번 시간에는 postgresql에서 random 함수를 알아보겠습니다.

 


 random 함수는 꽤 간단하게 쓸 수 있습니다. 그냥 random(). 끝입니다.

 

 결과를 보시면 0.1816107987이 나옵니다. 또 다시 호출해 보겠습니다.

 

 

 이번에는 0.3785214382가 나오네요. 문서에 따르면 이 함수는 0 이상 1 미만인 실수를 돌려준다고 되어 있어요. 추가로 언급된 부분은, security한 랜덤을 원한다면 crypto를 알아보라고 되어 있어요.

 

 그러면 위 쿼리는 무엇을 하는 것일까요? 일단 random()*100이면, 0이상 100미만인 랜덤 실수를 뽑습니다. 그런데 floor가 붙었네요. 바닥 함수이므로, [0, 99]의 랜덤한 정수를 뽑습니다.

 

 

 70은 0이상 99이하의 정수이니, 해당 쿼리를 돌리면 출현하게 됩니다.

 


 이제 1부터 46까지의 수 중, 랜덤하게 6개의 수를 중복 없이 뽑을 겁니다. 어떻게 하면 좋을까요? 일단 스텝 바이 스텝을 밟아봅시다. 먼저, 1부터 46까지를 뽑아봅시다.

 

 generate_series 함수는 간단히 말해서 데이터를 특정 규칙에 따라 생성해 주는 함수입니다. 더 정확한 규칙은, start, stop, gap 규칙입니다. 어디서 시작하고 어디서 끝낼 건지, 그리고 gap은 얼마만큼 줄 건지. 문서를 보면 제가 start와 stop 옵션만 주었다는 것을 알 수 있어요. 따라서, 1부터 46까지 차례대로 뽑히게 됩니다. python의 range 비슷한 무언가라고 생각하면 좀 쉬울 듯 합니다. 다른 점은, timestamp도 지원됩니다.

 

 

 일단 1부터 46까지 뽑힘을 알 수 있어요. 뽑힌 걸 가지고 어떻게 하면 좋을까요? 6개만 뽑는다는 것은, 다시 말해 6개를 어떠한 기준으로 정렬한 다음에 위에서부터 6개를 뽑아도 됩니다. 그러니, 정렬을 해서 뽑아도 될 텐데요. 랜덤하게 뽑고 싶습니다. 그러면, 정렬 기준을 random으로 잡아버리면 됩니다.

 

 

 쿼리는 요래 작성하였습니다. 이 말인 즉슨, 각 행마다, random() 결과값을 키로 삼아서 정렬한다는 의미입니다. 이 랜덤값은 바뀌기 때문에, 이 쿼리를 실행하면 계속 결과에 나타나는 수의 순서가 바뀌게 됩니다.

 

 

 1번째로 실행했을 때 결과입니다.

 

 

 2번째로 실행했을 때 결과입니다. 이제, 이 결과값 중 6개만 잘라내면 됨을 알 수 있습니다.