250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 데이터리안
- 프로그래머스문풀
- 파이썬문풀
- SQL
- leetcode문풀
- UNION
- 약수구하기
- 코테
- 코딩테스트
- with절
- 위키독스
- leetcode
- 서브쿼리
- 리트코드sql
- GROUPBY
- sql문풀
- mysql
- leetcodesql50
- 활성사용자수
- join
- SQL고득점KIT
- 셀프조인
- levle1
- 윈도우함수
- SQL테스트
- 프로그래머스
- 파이썬
- 데이터분석
- 문풀
- With
Archives
- Today
- Total
꿈은 데이터분석가, 취미는 계획
[MY SQL] 언어별 개발자 분류하기_비트 연산자 활용 본문
728x90
출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] : 언어별 개발자 분류하기
링크: https://school.programmers.co.kr/learn/courses/30/lessons/276036
문제(일부): 2개의 테이블 정보를 활용하여 보유한 스킬별로 등급부여
0.BIT_OR 집계함수 이해하기
여러 사용자의 권한을 그룹별로 합쳐서 최대 권한을 계산할 수 있음- 부서 ID가 10인 경우, 권한 1, 2, 4가 있는데, 이를 OR 연산하면 1 | 2 | 4 = 7이 됩니다.
즉, 읽기, 쓰기, 실행 권한 모두 있습니다. - 부서 ID가 20인 경우, 권한 3과 6을 OR 연산하면 3 | 6 = 7이 되므로
같은 권한을 가지게 됩니다.
CREATE TABLE UserPermissions (
UserID int,
DepartmentID int,
Permissions int
);
-- 각 비트는 다른 권한을 나타냅니다 (예: 1 = 읽기, 2 = 쓰기, 4 = 실행).
INSERT INTO UserPermissions VALUES (1, 10, 1);
INSERT INTO UserPermissions VALUES (2, 10, 2);
INSERT INTO UserPermissions VALUES (3, 10, 4);
INSERT INTO UserPermissions VALUES (4, 20, 3);
INSERT INTO UserPermissions VALUES (5, 20, 6);
-- 부서별로 모든 사용자의 권한을 OR 연산하여 합친 권한을 계산합니다.
SELECT DepartmentID, BIT_OR(Permissions) AS CombinedPermissions
FROM UserPermissions
GROUP BY DepartmentID;
1.BIT_OR 집계함수 사용 풀이법
2) BIT_OR연산자를 사용하여 ID별로 해당 스킬을 가지고 있는지 확인(GROUP BY ID이므로)
SELECT
CASE
WHEN
BIT_OR(category = "Front End") AND BIT_OR(S.name = "Python")
THEN "A"
WHEN
BIT_OR(S.name = "C#")
THEN "B"
WHEN
BIT_OR(category = "Front End")
THEN "C"
ELSE NULL
END AS grade,
id,
email
FROM developers AS D
JOIN skillcodes AS S
ON (D.skill_code & S.code) = S.code
GROUP BY id, email
HAVING grade IS NOT NULL
ORDER BY grade, id
2. WITH절 활용하기
2) 1번의 WITH절과 개발자 테이블을 조인
&연산자로 보유한 스킬 확인
CASE WHEN구문으로 등급부여한 WITH절 생성
&연산자로 보유한 스킬 확인
CASE WHEN구문으로 등급부여한 WITH절 생성
3) 메인쿼리에서 where조건절로 등급이 없는 레코드 제외
* 원본 풀이: https://school.programmers.co.kr/questions/75586
* 원본 풀이: https://school.programmers.co.kr/questions/75586
WITH FECODE AS (
SELECT SUM(CODE) AS FECODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End'
) ,
PYCODE AS (
SELECT CODE AS PYCODE
FROM SKILLCODES WHERE NAME = 'Python'
),
CSCODE AS (
SELECT CODE AS CSCODE
FROM SKILLCODES
WHERE NAME = 'C#'
),
GRDEVS AS(
SELECT CASE
WHEN (SKILL_CODE & FECODE) AND (SKILL_CODE & PYCODE) THEN 'A'
WHEN SKILL_CODE & CSCODE THEN 'B'
WHEN SKILL_CODE & FECODE THEN 'C'
END AS GRADE
, ID
, EMAIL
FROM DEVELOPERS, FECODE, PYCODE, CSCODE
)
SELECT *
FROM GRDEVS
WHERE GRADE IS NOT NULL
ORDER BY GRADE ASC, ID ASC
728x90
'SQL > sql문풀' 카테고리의 다른 글
[MY SQL] DENSE_RANK를 활용하여 리뷰를 가장 많이 작성한 회원의 리뷰 조회 (0) | 2024.04.27 |
---|---|
[MY SQL] WITH절을 활용하여 평가등급 및 성과금 조회 (1) | 2024.04.21 |
[MY SQL] 상/하반기 점수의 합이 가장 높은 사원 찾기 (1) | 2024.04.18 |
[MY SQL] WITH RECURSIVE 재귀쿼리 (0) | 2024.04.17 |
[MY SQL] 그룹별로 필터링 조건이 있는 경우 (0) | 2024.04.16 |