DataBase/Oracle

[Oracle] 로또쿼리 - 로또 번호 생성(추출) 쿼리

이지랩(ezLab) 2022. 12. 29. 13:00
반응형

로또 번호 생성(추출) 쿼리

 

 

 

만든배경

꽤 오래전에..
일하다가 문득 생각이 들었다.

(꽤나 하기 싫었었나보다.. ㅎㅎ)


데이터 없이 쿼리로만 로또를 뽑아주는 쿼리를 만들면 어떨까? 하고 생각이 들었다.
connect by 로 숫자를 생성하고 랜덤으로 숫자를 발생시키면 되지 않을까?

그래서 구상해봤다..



내용은 이렇다.

1번부터 45번까지 번호표를 든 사람들이 있다고 치자.
이들에게 랜덤으로 발생된 숫자를 나눠주고,
1등부터 6등까지 앞에 세우면 그들이 로또번호가 된다... ㅎㅎㅎ

그렇다.
이렇게 5팀 만들면 로또 한장이 나오는것이다.

바로 쿼리를 만들어보았다. ^^;


아래는 그 쿼리다.. ㅎㅎ

 

 

로또 번호 생성(추출) 쿼리 - 오라클(Oracle)
-- 로또번호 추출(생성) 쿼리 - 오라클(Oracle)
SELECT  A.PG                           AS NO
      , MAX(DECODE(A.RN, 1, A.RNK, 0)) AS "1"
      , MAX(DECODE(A.RN, 2, A.RNK, 0)) AS "2"
      , MAX(DECODE(A.RN, 3, A.RNK, 0)) AS "3"
      , MAX(DECODE(A.RN, 4, A.RNK, 0)) AS "4"
      , MAX(DECODE(A.RN, 5, A.RNK, 0)) AS "5"
      , MAX(DECODE(A.RN, 6, A.RNK, 0)) AS "6"
  FROM  (    
          SELECT  A.PG
                , RANK() OVER(PARTITION BY A.PG ORDER BY A.RNK) AS RN
                , A.RNK
            FROM  (        
                    SELECT  A.PG
                          , A.RN
                          , RANK() OVER(PARTITION BY A.PG ORDER BY A.VL, A.RN)   AS RNK
                      FROM  (
                              SELECT  -- 5팀
                                      TRUNC((ROWNUM-1) / 45) + 1  AS PG
                                      -- 1 ~ 45 번호표
                                    , MOD(ROWNUM - 1, 45) + 1     AS RN
                                      -- 랜덤으로 받은 숫자
                                    , DBMS_RANDOM.VALUE(1, 100)   AS VL
                                FROM  DUAL
                              CONNECT
                                  BY  LEVEL <= 45 * 5 -- 1~45번호표 x 5팀
                            ) A
                     ORDER
                        BY  1, 2, 3
                  ) A
           WHERE  A.RN  BETWEEN 1 AND 6
        ) A
 GROUP 
    BY  A.PG
;

 

쿼리결과

 

 

로또번호생성기 같은 프로그램에서는 지금까지 당첨번호된 번호를 바탕으로 패턴을 분석하고 예측하는 알고리즘(?)이 있겠지..??

이 쿼리에는 데이터가 없으니, 그런건 없다. ㅎㅎ

 

반응형