[MySQL] 로또 쿼리 - 로또 번호 자동 생성(추출) 쿼리
만든배경
오늘따라 일이 없다. ^^;;;;;;;
심심하다는 생각이 들던 차였다.
전에 오라클용으로 만든 로또 쿼리를 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
;
쿼리 결과
- GRP: 게임 갯수 (보통 5천원씩 하므로 5게임으로 셋팅하였음)
- V1~6 : 로또번호 6개
맺 음 말 ~
오늘은 심심풀이로 만들어본 쿼리였습니다.
쿼리는 몇 개 안되는 예약어를 통해서 개인별로 자신의 능력과 경험으로 만들어내므로,
사람에 따라 결과물이 크게 차이가 나게 됩니다.
(20년이 훨씬 넘도록 Programer와 DBA를 해 온 경험으로 하는 말이었습니다.. ㅎㅎ)
즉,
누구나 웹에서 쉽게 검색해보고,
짠~ 하고 만들 수 있는것이 아니며,
그 수준 또한 한번에 일치월장 할 수 있는것도 아닙니다.
다른 사람의 쿼리를
많이 보고,
많이 생각하고,
많이 좌절하고,
많이 실행해봐야..
실력이 향상됩니다.
오늘은 여기까지입니다~ ^^
