다시 풀어야하는 문제들 모음 (프로그래머스 MYSQL LEVEL 1,2,3)
LEVEL 2
⏹푼 문제
1.업그레이드 된 아이템 구하기
2.연도별 대장균 크기의 편차 구하기
⏹못 푼 문제
1.조건에 맞는 개발자 찾기
2.부모의 형질을 모두 가지는 대장균 찾기
SELECT A.ITEM_ID ,ITEM_NAME,RARITY
FROM ITEM_INFO A JOIN ITEM_TREE B
ON A.ITEM_ID=B.ITEM_ID
WHERE
PARENT_ITEM_ID IN
(SELECT ITEM_ID FROM ITEM_INFO WHERE RARITY='RARE')
ORDER BY 1 DESC;
#ITEM_TREE의 PARENT_ITEM_ID 가 0 또는 1일 때의 ITEM_ID 값 출력
#참고로 희귀도가 RARE인 아이템일 때, 해당 ITEM_ID와 PARENT_ITEM_ID가 묶여야한다.
-- 1.희귀도가 RARE인 아이템의 ITEM_ID구하기
/
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE RARITY='RARE';
/
-- 2. ITEM_INFO의 ITEM_ID와 ITEM_TREE의 PARENT_ID을 묶기
/
SELECT B.ITEM_ID
FROM (SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE RARITY='RARE') A JOIN ITEM_TREE B
ON A.ITEM_ID= B.PARENT_ITEM_ID;
/
-- 3. 해당 ITEM을 ITEM_INFO 와 연결시키기
SELECT ITEM_ID,ITEM_NAME,RARITY
FROM ITEM_INFO AS C
WHERE C.ITEM_ID IN (SELECT DISTINCT B.ITEM_ID
FROM (SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE RARITY='RARE') A JOIN ITEM_TREE B
ON A.ITEM_ID= B.PARENT_ITEM_ID)
ORDER BY ITEM_ID DESC;
SELECT
YEAR(E.DIFFERENTIATION_DATE) AS YEAR,
((SELECT MAX(SIZE_OF_COLONY)
FROM ECOLI_DATA
WHERE YEAR(DIFFERENTIATION_DATE) = YEAR(E.DIFFERENTIATION_DATE)) - E.SIZE_OF_COLONY) AS YEAR_DEV,
E.ID
FROM ECOLI_DATA AS E
ORDER BY YEAR ASC, YEAR_DEV ASC;
-- 1.분화된 연도별 가장 큰 대장균의 크기를 구하기
/*
SELECT YEAR(DIFFERENTIATION_DATE) AS YEAR,MAX(SIZE_OF_COLONY)
FROM ECOLI_DATA
GROUP BY YEAR(DIFFERENTIATION_DATE);
*/
-- 2.각 대장균의 분화된 대장균 크기의 편차를 구하기
-- 2-1.조인할 테이블 생성하기(연도별 데이터로 변환시키고 조인하기)
/*
SELECT ID,SIZE_OF_COLONY,YEAR(DIFFERENTIATION_DATE) AS YEAR
FROM ECOLI_DATA
*/
-- 2-2. JOIN을 한 다음 대장균 크기의 편차를 구하고 조건에 맞추어 오름차순으로 정렬하기
SELECT A.YEAR,( MAX_COLONY - SIZE_OF_COLONY) AS YEAR_DEV, ID
FROM
(SELECT ID,SIZE_OF_COLONY,YEAR(DIFFERENTIATION_DATE) AS YEAR
FROM ECOLI_DATA ) AS A
JOIN
(SELECT YEAR(DIFFERENTIATION_DATE) AS YEAR,MAX(SIZE_OF_COLONY) AS MAX_COLONY
FROM ECOLI_DATA GROUP BY YEAR(DIFFERENTIATION_DATE)) AS B
ON A.YEAR=B.YEAR
ORDER BY 1 ASC, 2 ASC
;
비트연산자를 활용해서 문제를 푸는 건 너무 어렵다..다시 한번 더 풀어봐야겠다!
SELECT ID, GENOTYPE, PARENT_ID
FROM ECOLI_DATA
WHERE ID IN (
SELECT PARENT_ID
FROM ECOLI_DATA
)
AND GENOTYPE IN (
SELECT ID
FROM ECOLI_DATA
);
SELECT *
FROM ECOLI_DATA AS E3
WHERE
E3.GENOTYPE IN (SELECT GENOTYPE FROM ECOLI_DATA AS E2 WHERE E2.ID IN
(SELECT E.ID FROM ECOLI_DATA AS E WHERE E.PARENT_ID IN
(SELECT PARENT_ID FROM ECOLI_DATA GROUP BY ID)
GROUP BY E.ID))
&
E3.GENOTYPE IN ( SELECT GENOTYPE
FROM ECOLI_DATA
GROUP BY ID)
=
E3.GENOTYPE IN (SELECT GENOTYPE FROM ECOLI_DATA AS E2 WHERE E2.ID IN
(SELECT E.ID FROM ECOLI_DATA AS E WHERE E.PARENT_ID IN
(SELECT PARENT_ID FROM ECOLI_DATA GROUP BY ID)
GROUP BY E.ID))
;
-- 1.대장균별 형질을 나타내기: ID기준 GENOTYPE 구하기
-- 2.보유한 형질 구하기 : GENOTYPE 진수 변환하기
-- 3.개체별로 살펴보기 : ID의 PARENT_ID와 GENOTYPE비교하기
-- 이때 GENOTYPE은 모든 PARENT_ID 값을 가지고 있어야한다.
-- ID의 형질 , 부모 ID의 형질 비교