SQL 문구를 사용하여 연례 추첨 프로그램의 코드를 실현하다

연말이 가까워지니 추첨은 틀림없이 모두가 회사 연례 회의에서 가장 기대하는 활동일 것이다.만약 사장이 너에게 연례 추첨 절차를 밟으라고 한다면, 너는 어떻게 실현할 거니?오늘은 SQL 문구를 통해 이 기능을 실현하는 방법을 소개해 드리겠습니다.실현의 원리는 사실 매우 간단하다. 함수를 통해 모든 사람에게 랜덤수를 분배한 다음에 가장 크거나 가장 작은 N개의 랜덤수에 대응하는 직원을 뽑는 것이다.
📝본고에서 사용한 예시표다운로드 가능.

Oracle


Oracle은 무작위 숫자와 무작위 문자열 등을 포함하여 무작위 데이터를 생성하는 데 사용할 수 있는 시스템 패키지DBMS_RANDOM를 제공합니다.여기서 DBMS_RANDOM.VALUE 함수는 0보다 작은 수의 무작위 숫자를 생성하는 데 사용할 수 있습니다.이 함수를 이용하여 우리는 표에서 무작위 데이터 줄을 되돌릴 수 있다.예:

SELECT emp_id, emp_name
FROM employee 
ORDER BY dbms_random.value
FETCH FIRST 1 ROWS ONLY;

EMP_ID|EMP_NAME|
------|--------|
 3|  |
이상의 조회를 다시 실행하면 다른 직원으로 돌아갑니다.또한 여러 명의 랜덤 직원을 한 번에 복귀할 수 있습니다.

SELECT emp_id, emp_name
FROM employee 
ORDER BY dbms_random.value
FETCH FIRST 3 ROWS ONLY;

EMP_ID|EMP_NAME|
------|--------|
 6|  |
 21|  |
 9|  |
같은 직원이 여러 번 당첨되지 않도록 당첨된 직원의 표를 저장할 수 있습니다.
매번 상을 받을 때마다

--  
CREATE TABLE emp_win(
 emp_id integer PRIMARY KEY, --  
 emp_name varchar(50) NOT NULL, --  
 grade varchar(50) NOT NULL --  
);
당첨된 직원과 레벨을emp_win표에서 매번 당첨될 때마다 이미 당첨된 직원을 배제합니다.예를 들어 다음 문장은 3등상 3명을 뽑을 수 있다.

INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY dbms_random.value
FETCH FIRST 3 ROWS ONLY;

SELECT * FROM emp_win;

EMP_ID|EMP_NAME|GRADE |
------|--------|--------|
 8|  |  |
 3|  |  |
 9|  |  |
계속해서 2등상 2명과 1등 1명을 뽑겠습니다.

--  2 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY dbms_random.value
FETCH FIRST 2 ROWS ONLY;

--  1 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY dbms_random.value
FETCH FIRST 1 ROWS ONLY;

SELECT * FROM emp_win;

EMP_ID|EMP_NAME|GRADE |
------|--------|-------|
 8|  |  |
 3|  |  |
 9|  |  |
 6|  |  |
 22|  |  |
 10|  |  |
우리는 상기 문장을 하나의 저장 프로세스로 봉인할 수 있다.

CREATE OR REPLACE PROCEDURE luck_draw(pv_grade varchar, pn_num integer)
IS
BEGIN
	INSERT INTO emp_win
 SELECT emp_id, emp_name, pv_grade
 FROM employee
 WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
 ORDER BY dbms_random.value
 FETCH FIRST pn_num ROWS ONLY;

 COMMIT;
END luck_draw;
/

CALL luck_draw(' ', 1);

SELECT * FROM emp_win WHERE grade = ' ';

EMP_ID|EMP_NAME|GRADE |
------|--------|-------|
 25|  |  |
Oracle에서 무작위 숫자, 문자열, 날짜, 유효성 검사 코드 및 UUID를 생성하는 방법에 대한 정보이 문장을 참고하다.

MySQL


MySQL은 0보다 작은 무작위 숫자를 생성하는 데 사용할 수 있는 시스템 함수RAND를 제공합니다.이 함수를 이용하여 우리는 표에서 무작위 기록을 되돌릴 수 있다.예:

SELECT emp_id, emp_name
FROM employee 
ORDER BY RAND()
LIMIT 1;

emp_id|emp_name|
------|--------|
 19|  |
상기 문장을 다시 실행하면 다른 직원으로 돌아갈 것입니다.우리도 한 번에 여러 명의 무작위 직원을 되돌릴 수 있다.

SELECT emp_id, emp_name
FROM employee 
ORDER BY RAND()
LIMIT 3;

emp_id|emp_name|
------|--------|
 1|  |
 20|  |
 23|  |
같은 직원이 여러 번 당첨되지 않도록 당첨된 직원의 표를 저장할 수 있습니다.

--  
CREATE TABLE emp_win(
 emp_id integer PRIMARY KEY, --  
 emp_name varchar(50) NOT NULL, --  
 grade varchar(50) NOT NULL --  
);
매번 당첨된 직원과 레벨을 emp_win표에서 매번 당첨될 때마다 이미 당첨된 직원을 배제합니다.예를 들어 다음 문장은 3등상 3명을 뽑을 수 있다.

INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY RAND()
LIMIT 3;

SELECT * FROM emp_win;

emp_id|emp_name|grade |
------|--------|-------|
 18|  |  |
 23|  |  |
 24|  |  |
우리는 계속해서 2등상 2명과 일등상 1명을 뽑았다.

--  2 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY RAND()
LIMIT 2;

--  1 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY RAND()
LIMIT 1;

SELECT * FROM emp_win;

emp_id|emp_name|grade |
------|--------|-------|
 2|  |  |
 18|  |  |
 20|  |  |
 23|  |  |
 24|  |  |
 25|  |  |
우리는 상기 문장을 하나의 저장 프로세스로 봉인할 수 있다.

DELIMITER $$

CREATE PROCEDURE luck_draw(IN pv_grade varchar(50), IN pn_num integer)
BEGIN
	INSERT INTO emp_win
 SELECT emp_id, emp_name, pv_grade
 FROM employee
 WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
 ORDER BY RAND()
 LIMIT pn_num;

 SELECT * FROM emp_win;
END$$

DELIMITER ;

CALL luck_draw(' ', 1);

emp_id|emp_name|grade |
------|--------|-------|
 2|  |  |
 8|  |  |
 18|  |  |
 20|  |  |
 23|  |  |
 24|  |  |
 25|  |  |
ySQL에서 임의 숫자, 문자열, 날짜, 유효성 검사 코드 및 UUID를 생성하는 방법에 대한 정보이 문장을 참고하다.

Microsoft SQL Server


Microsoft SQL Server는 무작위 GUID를 생성하는 데 사용할 수 있는 시스템 함수NEWID를 제공합니다.이 함수를 이용하여 우리는 표에서 무작위 데이터 줄을 되돌릴 수 있다.예:

SELECT TOP(1) emp_id, emp_name
FROM employee 
ORDER BY NEWID();

emp_id|emp_name|
------|--------|
 25|  |
상기 문장을 다시 실행하면 다른 직원으로 돌아갈 것입니다.또한 여러 명의 랜덤 직원을 한 번에 복귀할 수 있습니다.

SELECT TOP(3) emp_id, emp_name
FROM employee 
ORDER BY NEWID();

emp_id|emp_name|
------|--------|
 23|  |
 1|  |
 21|  |
Microsoft SQL Server는 임의의 숫자를 되돌려주는 RAND 함수를 제공하지만, 이 함수는 모든 데이터 줄에 대해 같은 결과를 되돌려주기 때문에 테이블의 임의 기록에 사용할 수 없습니다.예:

SELECT TOP(3) emp_id, emp_name, RAND() AS rd
FROM employee 
ORDER BY RAND();

emp_id|emp_name|rd |
------|--------|------------------|
 23|  |0.8623555267583647|
 18|  |0.8623555267583647|
 11|  |0.8623555267583647|
같은 직원이 여러 번 당첨되지 않도록 당첨된 직원의 표를 저장할 수 있습니다.

--  
CREATE TABLE emp_win(
 emp_id integer PRIMARY KEY, --  
 emp_name varchar(50) NOT NULL, --  
 grade varchar(50) NOT NULL --  
);
우리는 매번 당첨 직원과 등급을 emp_에 저장합니다win표에서 매번 당첨될 때마다 이미 당첨된 직원을 배제합니다.예를 들어 다음 문장은 3등상 3명을 뽑을 수 있다.

INSERT INTO emp_win
SELECT TOP(3) emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY NEWID();

SELECT * FROM emp_win;

emp_id|emp_name|grade|
------|--------|-----|
 14|  | |
 17|  | |
 21|  | |
계속해서 2등상 2명과 1등 1명을 뽑겠습니다.

--  2 
INSERT INTO emp_win
SELECT TOP(2) emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY NEWID();

--  1 
INSERT INTO emp_win
SELECT TOP(1) emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY NEWID();

SELECT * FROM emp_win;

emp_id|emp_name|grade|
------|--------|-----|
 14|  | |
 15|  | |
 17|  | |
 18|  | |
 21|  | |
 22|  | |
우리는 상기 문장을 하나의 저장 프로세스로 봉인할 수 있다.

CREATE OR ALTER PROCEDURE luck_draw(@pv_grade VARCHAR(50), @pn_num integer)
AS
BEGIN
	INSERT INTO emp_win
 SELECT TOP(@pn_num) emp_id, emp_name, @pv_grade
 FROM employee
 WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
 ORDER BY NEWID()
 
 SELECT * FROM emp_win
END;

EXEC luck_draw ' ', 1;

emp_id|emp_name|grade|
------|--------|-----|
 14|  | |
 15|  | |
 17|  | |
 18|  | |
 21|  | |
 22|  | |
 23|  | |
icrosoft SQL Server에서 무작위 숫자, 문자열, 날짜, 유효성 검사 코드 및 UUID를 생성하는 방법에 대해서는 이 문장 을 참조하십시오.

PostgreSQL


PostgreSQL은 0보다 작은 무작위 숫자를 생성하는 데 사용할 수 있는 시스템 함수RANDOM를 제공합니다.이 함수를 이용하여 우리는 표에서 무작위 기록을 되돌릴 수 있다.예:

SELECT emp_id, emp_name
FROM employee 
ORDER BY RANDOM()
LIMIT 1;

emp_id|emp_name|
------|--------|
 22|  |
상기 문장을 다시 실행하면 다른 직원으로 돌아갈 것입니다.우리도 한 번에 여러 명의 무작위 직원을 되돌릴 수 있다.

SELECT emp_id, emp_name
FROM employee 
ORDER BY RAND()
LIMIT 3;

emp_id|emp_name|
------|--------|
 8|  |
 4|  |
 9|  |
같은 직원이 여러 번 당첨되지 않도록 당첨된 직원의 표를 저장할 수 있습니다.

--  
CREATE TABLE emp_win(
 emp_id integer PRIMARY KEY, --  
 emp_name varchar(50) NOT NULL, --  
 grade varchar(50) NOT NULL --  
);
매번 당첨된 직원과 레벨을 emp_win표에서 매번 당첨될 때마다 이미 당첨된 직원을 배제합니다.예를 들어 다음 문장은 3등상 3명을 뽑을 수 있다.

INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY RANDOM()
LIMIT 3;

SELECT * FROM emp_win;

emp_id|emp_name|grade|
------|--------|-----|
 23|  | |
 15|  | |
 24|  | |
우리는 계속해서 2등상 2명과 일등상 1명을 뽑았다.

--  2 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY RANDOM()
LIMIT 2;

--  1 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY RANDOM()
LIMIT 1;

SELECT * FROM emp_win;

emp_id|emp_name|grade|
------|--------|-----|
 23|  | |
 15|  | |
 24|  | |
 1|  | |
 21|  | |
 22|  | |
우리는 상기 문장을 하나의 저장 프로세스로 봉인할 수 있다.

CREATE OR REPLACE PROCEDURE luck_draw(pv_grade IN VARCHAR, pn_num IN INTEGER)
LANGUAGE plpgsql
AS $$
BEGIN
	INSERT INTO emp_win
 SELECT emp_id, emp_name, pv_grade
 FROM employee
 WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
 ORDER BY RANDOM()
 LIMIT pn_num;
END;
$$

CALL luck_draw(' ', 1);

SELECT * FROM emp_win WHERE grade = ' ';

emp_id|emp_name|grade|
------|--------|-----|
 5|  | |
PostgreSQL에서 무작위 숫자, 문자열, 날짜, 인증 코드 및 UUID를 생성하는 방법에 관하여이 문장을 참고하다

SQLite


SQLite의 RANDOM 함수는 9223372036854775808보다 작은 9223372036854775807의 무작위 정수를 생성하는 데 사용할 수 있다.이 함수를 이용하여 우리는 표에서 무작위 데이터 줄을 되돌릴 수 있다.예:

SELECT emp_id, emp_name
FROM employee
ORDER BY RANDOM()
LIMIT 1;

emp_id|emp_name|
------|--------|
 4|  |
상기 문장을 다시 실행하면 다른 직원으로 돌아갈 것입니다.또한 여러 명의 랜덤 직원을 한 번에 복귀할 수 있습니다.

SELECT emp_id, emp_name
FROM employee
ORDER BY RANDOM()
LIMIT 3;

emp_id|emp_name|
------|--------|
 16|  |
 15|  |
 11|  |
같은 직원이 여러 번 당첨되지 않도록 당첨된 직원의 표를 저장할 수 있습니다.

--  
CREATE TABLE emp_win(
 emp_id integer PRIMARY KEY, --  
 emp_name varchar(50) NOT NULL, --  
 grade varchar(50) NOT NULL --  
);
우리는 매번 당첨 직원과 등급을 emp_에 저장합니다win표에서 매번 당첨될 때마다 이미 당첨된 직원을 배제합니다.예를 들어 다음 문장은 3등상 3명을 뽑을 수 있다.

INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win) --  
ORDER BY RANDOM()
LIMIT 3;

SELECT * FROM emp_win;

emp_id|emp_name|grade|
------|--------|-----|
 2|  | |
 3|  | |
 8|  | |
계속해서 2등상 2명과 1등 1명을 뽑겠습니다.

--  2 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY RANDOM()
LIMIT 2;

--  1 
INSERT INTO emp_win
SELECT emp_id, emp_name, ' '
FROM employee
WHERE emp_id NOT IN (SELECT emp_id FROM emp_win)
ORDER BY RANDOM()
LIMIT 1;

SELECT * FROM emp_win;

emp_id|emp_name|grade|
------|--------|-----|
 2|  | |
 3|  | |
 4|  | |
 8|  | |
 16|  | |
 23|  | |
SQLite에서 무작위 숫자, 문자열, 날짜, 유효성 검사 코드 및 UUID를 생성하는 방법에 대한 정보이 문장을 참고하다.

총결산


우리는 데이터베이스 시스템이 제공한 랜덤수 함수를 통해 표의 랜덤 기록을 되돌려 연간 추첨 기능을 실현한다.
SQL 문구를 사용하여 연례 추첨 프로그램을 실현하는 것에 관한 이 글은 여기에 소개되었습니다. 더 많은 관련 sql 연례 추첨 프로그램의 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기