반응형
- 로또 쿼리 구성
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 45;
일단 45까지의 계층을 나눈다.
1~45 까지의 행이 생길텐데 얘를 한 그룹으로 만들어 주기 위해
1~45 까지 1 그룹, 46~90 까지 2 그룹.. 이런식으로 나누기 위해
LEVEL 을 45로 나누고 CEIL (올림함수) 를 사용하여 그룹을 나눈다.
SELECT CEIL(LEVEL / 45)
FROM DUAL
CONNECT BY LEVEL <= 45 * 2;
그럼 1~45번 까지 1로 묶였고, 46~90 까지는 2로 세팅한다.
이제 그룹별 랜덤 자연수 (1~45) 를 지정해야하니 MOD(LEVEL - 1, 45) + 1 로 수를 나열한다.
그룹별 그리고 랜덤함수를 사용하여 어센딩 해준다.
SELECT CEIL(LEVEL / 45) AS GRP
,MOD(LEVEL - 1, 45) + 1 AS NUM
FROM DUAL
CONNECT BY LEVEL <= 45 * 2
ORDER BY 1, DBMS_RANDOM.VALUE
이렇게 숫자가 무작위로 정렬되는걸 볼 수 있다.
이 숫자들 중 보너스 번호 포함 6개 까지 한 그룹으로 매핑해야 하니
GROUP BY 를 통해 묶어주도록하자.
SELECT GRP
,NUM
FROM (
SELECT GRP
,NUM
,MOD(ROWNUM - 1, 45) + 1 AS RNUM
FROM (
SELECT CEIL(LEVEL / 45) AS GRP
,MOD(LEVEL - 1, 45) + 1 AS NUM
FROM DUAL
CONNECT BY LEVEL <= 45 * 2
ORDER BY 1, DBMS_RANDOM.VALUE
)
)
WHERE RNUM <= 6
ORDER BY GRP, NUM;
이제 행을 열로 만들 차례이다.
SELECT MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 1, NUM)) AS NO1,
MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 2, NUM)) AS NO2,
MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 3, NUM)) AS NO3,
MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 4, NUM)) AS NO4,
MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 5, NUM)) AS NO5,
MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 6, NUM)) AS NO6
FROM (
SELECT GRP
,NUM
FROM (
SELECT GRP
,NUM
,MOD(ROWNUM - 1, 45) + 1 AS RNUM
FROM (
SELECT CEIL(LEVEL / 45) AS GRP
,MOD(LEVEL - 1, 45) + 1 AS NUM
FROM DUAL
CONNECT BY LEVEL <= 45 * 2
ORDER BY 1, DBMS_RANDOM.VALUE
)
)
WHERE RNUM <= 6
ORDER BY GRP, NUM
)
GROUP BY GRP
ORDER BY 1;
이렇게 2줄 구매예상번호로 2줄 랜덤번호가 생성되었다.
CONNECT BY LEVEL <= 45 * ? 구문에서 원하는 구매횟수를 넣어 입력하면 된다.
반응형
반응형
'Programming > DB' 카테고리의 다른 글
ORACLE ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다 오류 해결 방법 (0) | 2025.04.07 |
---|---|
ORACLE ORA-01555: Snapshot Too Old 오류 해결 방법 (0) | 2025.04.05 |
ORACLE ORA-01652 오류: "임시 세그먼트를 확장할 수 없습니다" 해결 방법 (0) | 2025.04.04 |
오라클 ROW_NUMBER() 함수와 COUNT() OVER 함수 차이 (0) | 2025.04.04 |
ORACLE MERGE INTO와 UPDATE의 차이점 (1) | 2024.10.30 |