DataBase/MySQL

[MySQL] 로또 쿼리 - 로또 번호 자동 생성(추출) 쿼리

이지랩(ezLab) 2024. 7. 11. 09:19
반응형

 

만든배경

오늘따라 일이 없다. ^^;;;;;;;

심심하다는 생각이 들던 차였다.

전에 오라클용으로 만든 로또 쿼리를 MySQL용으로 만들어볼까??

이런 생각에 심심풀이용으로 만들어 보았다.

 

내용은 지난번과 비슷하다.

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

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

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

 

 

 

시작 전에 !

Oracle 용으로 만든게 있는데, 왜 MySQL용으로 다시 만들었나?

Oracle은 Oracle적으로 쿼리를 만들기에..

뭐.. 이것 저것 조금 다르고...

간단하게 말하면..

Oracle을 제외한 다른 쿼리는 흔히 모두 AnsiQuery라고 표준 쿼리라는 걸 쓰는데,

오라클만은 일반적으로 안시쿼리를 사용하지 않아요..

물론, 표준쿼리를 만들어도 동작은 합니다. 추천하지는 않습니다.

(아마도 함께 코웍을 하시는분들에게 따를 당할지도.. ^^)

 

 

자, 그럼 시작합니다.

 

로또 번호 생성(추출) 쿼리 - MySQL
WITH RECURSIVE TEMP AS 
(
    SELECT 1              AS LEVEL
         , 1              AS GRP
         , MOD(1, 45) + 1 AS RNO
         , RAND()         AS RVALUE
    UNION ALL
    SELECT 1+A.LEVEL                    AS LEVEL
         , TRUNCATE(A.LEVEL / 45, 0)+1  AS GRP
         , MOD(1+A.LEVEL, 45) + 1       AS RNO
         , RAND()                       AS RVALUE
      FROM TEMP A
     WHERE A.LEVEL < 45 * 5
)
 SELECT A.GRP                                                 -- 게임번호
      , MAX(CASE WHEN A.SEQ = 1 THEN A.RNO ELSE 0 END)  AS V1 -- 1번 번호
      , MAX(CASE WHEN A.SEQ = 2 THEN A.RNO ELSE 0 END)  AS V2 -- 2번 번호
      , MAX(CASE WHEN A.SEQ = 3 THEN A.RNO ELSE 0 END)  AS V3 -- 3번 번호
      , MAX(CASE WHEN A.SEQ = 4 THEN A.RNO ELSE 0 END)  AS V4 -- 4번 번호
      , MAX(CASE WHEN A.SEQ = 5 THEN A.RNO ELSE 0 END)  AS V5 -- 5번 번호
      , MAX(CASE WHEN A.SEQ = 6 THEN A.RNO ELSE 0 END)  AS V6 -- 6번 번호
   FROM ( 
         SELECT A.GRP
              , A.RNO
              , RANK() OVER(PARTITION BY A.GRP ORDER BY A.RNO ASC)  AS SEQ
           FROM ( 
                   SELECT A.LEVEL
                        , A.RVALUE
                        , A.GRP
                        , A.RNO
                        , RANK() OVER(PARTITION BY A.GRP ORDER BY A.RVALUE DESC, A.LEVEL ASC) AS RANK
                     FROM TEMP A
                ) A
          WHERE A.RANK <= 6
        ) A
  GROUP 
     BY A.GRP
;

 

쿼리 결과

이렇게 5천원짜리 하나 살때와 같은 모양으로 나온다 ㅎㅎ

 

  • GRP: 게임 갯수 (보통 5천원씩 하므로 5게임으로 셋팅하였음)
  • V1~6 : 로또번호 6개

 

 

맺 음 말 ~

오늘은 심심풀이로 만들어본 쿼리였습니다.

쿼리는 몇 개 안되는 예약어를 통해서 개인별로 자신의 능력과 경험으로 만들어내므로,

사람에 따라 결과물이 크게 차이가 나게 됩니다.

(20년이 훨씬 넘도록 Programer와 DBA를 해 온 경험으로 하는 말이었습니다.. ㅎㅎ)

 

즉,

누구나 웹에서 쉽게 검색해보고,

짠~ 하고 만들 수 있는것이 아니며,

그 수준 또한 한번에 일치월장 할 수 있는것도 아닙니다.

다른 사람의 쿼리를

많이 보고,

많이 생각하고,

많이 좌절하고,

많이 실행해봐야..

실력이 향상됩니다.

 

 

오늘은 여기까지입니다~ ^^

 



반응형