

요즘 SQL에 대해 공부하다보니 자연스레 프로그래머스 문제를 풀기 시작했다.
사실 level 1~2 문제는 쉽다.. join문만 알아도..
근데 문제는 어? 내가 레벨 1짜리를 못풀어? 하는 충격이 있었다..
문제는 다음과 같다.
-문제-
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
Column name Type Nullable
ID INTEGER FALSE
PARENT_ID INTEGER TRUE
SIZE_OF_COLONY INTEGER FALSE
DIFFERENTIATION_DATE DATE FALSE
GENOTYPE INTEGER FALSE
최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
문제
2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.
예시
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
ID PARENT_ID SIZE_OF_COLONY DIFFERENTIATION_DATE GENOTYPE
1 NULL 10 2019/01/01 8
2 NULL 2 2019/01/01 15
3 2 100 2020/01/01 1
4 2 16 2020/01/01 13
각 대장균 별 형질을 2진수로 나타내면 다음과 같습니다.
ID 1 : 1000₍₂₎
ID 2 : 1111₍₂₎
ID 3 : 1₍₂₎
ID 4 : 1101₍₂₎
각 대장균 별 보유한 형질을 다음과 같습니다.
ID 1 : 4
ID 2 : 1, 2, 3, 4
ID 3 : 1
ID 4 : 1, 3, 4
따라서 2번 형질이 없는 대장균 개체는 ID 1, ID 3, ID 4 이며 이 중 1번이나 3번 형질을 보유한 대장균 개체는 ID 3, ID 4 입니다.
따라서 결과는 다음과 같아야 합니다.
이 문제를 풀 때 어? 이거 어떻게 풀지? 생각이 들었다
할거면 다 2진수로 바꾸고 조건 걸어야하는데?
이거 연산 어떻게 하더라??
맞다.. 비트연산자 까먹고 30분 고민한 사람 그게 나에요
-- 코드를 작성해주세요
select count(*) as COUNT from ecoli_data
where (GENOTYPE & 2) != 2 AND ((GENOTYPE & 4) = 4 OR (GENOTYPE & 1) = 1);
답도 참 쉽다..
이걸 못풀어서.. 그런 치욕을..
이거 말고도 조건에 따른 결과에 따라 다르게 나오게 하려면?
다음 문제를 보자
문제
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
Column name Type Nullable
ID INTEGER FALSE
PARENT_ID INTEGER TRUE
SIZE_OF_COLONY INTEGER FALSE
DIFFERENTIATION_DATE DATE FALSE
GENOTYPE INTEGER FALSE
최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
문제
대장균 개체의 크기가 100 이하라면 'LOW', 100 초과 1000 이하라면 'MEDIUM', 1000 초과라면 'HIGH' 라고 분류합니다. 대장균 개체의 ID(ID) 와 분류(SIZE)를 출력하는 SQL 문을 작성해주세요.이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.
예시
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
ID PARENT_ID SIZE_OF_COLONY DIFFERENTIATION_DATE GENOTYPE
1 NULL 17 2019/01/01 5
2 NULL 150 2019/01/01 3
3 1 4000 2020/01/01 4
대장균 개체 ID(ID) 1,2,3 에 대해 개체의 크기는 각각 17, 150, 4000 이므로 분류된 이름은 각각 'LOW', 'MEDIUM', 'HIGH' 입니다. 따라서 결과를 개체의 ID 에 대해 오름차순 정렬하면 다음과 같아야 합니다.
ID SIZE
1 LOW
2 MEDIUM
3 HIGH
이걸 보고 IF, ELSE를 생각했는데 문법이 다르더라.. 분명 공부는 했다 SQLD 취득할 때..
오래 안하면 이렇게 된다..
SELECT id,
CASE
WHEN size_of_colony <= 100 THEN 'LOW'
WHEN size_of_colony <= 1000 THEN 'MEDIUM'
ELSE 'HIGH'
END AS SIZE
FROM ecoli_data;
참 간단하게 할 수 있다
SELECT
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END AS new_column
FROM table;
이 형식을 잊지 않기로 해요.... 뭐 바보아니면...
두 비트가 모두 1일 때만 1을 반환.
예: 0101 & 0011 = 0001
두 비트 중 하나라도 1이면 1을 반환.
예: 0101 | 0011 = 0111
두 비트가 서로 다르면 1을 반환.
예: 0101 ^ 0011 = 0110
모든 비트를 반전.
예: ~0101 = 1010 (비트 수에 따라 결과 다름)
비트를 왼쪽으로 지정된 횟수만큼 이동, 오른쪽은 0으로 채움.
예: 0101 << 2 = 010100
비트를 오른쪽으로 지정된 횟수만큼 이동, 왼쪽은 0 또는 부호 비트로 채움.
예: 0101 >> 2 = 0001
이 간단한 건 쓸 수 있어야한다..!