면접 합격에 도움이 되는 SQL 연습 문제
나는 그 두 가지 질문에 모두 실패했습니다.
문제를 풀어주지는 않겠지만, 내가 실패한 부분에서 성공할 수 있도록 연습할 문제를 줄 것입니다!
이 질문은 SQL 인터뷰 문제를 신속하게 해결하는 데 필요한 많은 원칙을 결합합니다.
저보다 더 잘 준비하시길 바랍니다 😅
개 데이터베이스
당신이 개 보호소를 운영하고 있고 개와 주인의 데이터베이스가 있다고 상상해보세요. 모든 개에는 한 명의 주인이 있지만 주인은 여러 개를 가질 수 있습니다.
다음은 PostgreSQL로 작성된 소유자 및 개 테이블입니다.
소유자 테이블
CREATE TABLE owners (
id SERIAL PRIMARY KEY,
name VARCHAR(256)
);
개 테이블
CREATE TABLE dogs (
id SERIAL PRIMARY KEY,
owner_id INTEGER REFERENCES owners(id),
breed VARCHAR(256),
adopted_on TIMESTAMP
);
소유자와 dogs 테이블 사이에는 일대다 관계가 있습니다. 각 개에 연결된 하나의 소유자 ID가 있으며 외래 키 제약 조건에 의해 시행됩니다. 즉, 실제로 소유자 테이블에 존재하는 소유자 ID만 사용할 수 있습니다.
질문
이제 테이블이 설정되었으므로 실제 질문에 도달할 수 있습니다.
소유자의 이름과 함께 각 소유자가 채택한 최신 개를 제공하는 SQL 쿼리를 작성하십시오.
아주 간단하죠?
다음은 도움이 되는 몇 가지 예시 데이터입니다.
owners
id | name
----+--------
1 | PersonA
2 | PersonB
dogs
id | owner_id | breed | adopted_on
----+----------+-----------+--------------
1 | 1 | chow chow | 2019-02-03
2 | 2 | dalmation | 2019-03-07
3 | 2 | beagle | 2020-09-21
4 | 1 | pit bull | 2020-08-01
질문에 대한 답은 다음과 같은 결과를 제공해야 합니다.
✅ RESULT
name | breed | adopted_on
----------+----------+------------
PersonB | beagle | 2020-09-21
PersonA | pit bull | 2020-08-01
먼저 이것을 직접 시도한 다음 아래 답변을 살펴 보겠습니다. 컴퓨터에 이것을 설정하는 것에 대해 걱정하지 마십시오! 답변을 테스트할 수 있는 SQL Fiddle(CodePen과 비슷하지만 SQL용)이 있습니다!
http://sqlfiddle.com/#!17/5059f/10
최종 답변
이 단계를 단계별로 살펴보겠습니다. 이 작업을 수행하는 몇 가지 다른 방법이 있을 수 있지만 이것이 내 방법입니다.
파트 1: 최신 개 얻기
먼저 각 소유자별로 최신 채택 날짜를 찾습니다.
이를 위해 소유자별로 그룹화한 후
adopted_on
열에 max 함수를 사용합니다. 나는 또한 owner_id
를 가져와서 다른 테이블에 조인하는 데 사용할 수 있는지 확인합니다.SELECT owner_id, max(adopted_on) FROM dogs GROUP BY owner_id
RESULT
owner_id | max
---------+--------------
1 | 2020-09-21
2 | 2020-08-01
파트 2: 최신 개 품종 얻기
다음으로 마지막 쿼리를 dogs 테이블(자체)과 조인하여 개의 품종을 가져오고 입양 날짜 및 소유자와 일치시킵니다.
SELECT dogs.breed, dogs.adopted_on FROM dogs
JOIN (
SELECT owner_id, max(adopted_on) FROM dogs GROUP BY owner_id
) AS newest_dogs
ON
dogs.owner_id = newest_dogs.owner_id AND
dogs.adopted_on = newest_dogs.max;
RESULT
breed | adopted_on
-----------+--------------
beagle | 2020-09-21
pit bull | 2020-08-01
최종: 소유자의 이름을 가져옵니다.
마지막으로 소유자 테이블에 대한 마지막 쿼리 결과를 조인하여 이름을 얻습니다.
SELECT owners.name, dogs.breed, dogs.adopted_on FROM dogs
JOIN (
SELECT owner_id, max(adopted_on) FROM dogs GROUP BY owner_id
) AS newest_dogs
ON
dogs.owner_id = newest_dogs.owner_id AND
dogs.adopted_on = newest_dogs.max
JOIN
owners ON dogs.owner_id = owners.id;
✅ FINAL RESULT
name | breed | adopted_on
----------+----------+------------
PersonB | beagle | 2020-09-21
PersonA | pit bull | 2020-08-01
결론
질문은 간단했지만 몇 가지 까다로운 질문을 해야 했습니다! 테이블을 두 번 조인하고 테이블 중 하나에서 최대 집계를 찾아야 했습니다.
이 연습을 통해 무언가를 배웠기를 바랍니다. 내 최종 답변을 실험하고 싶다면 아래의 최종 답변과 함께 SQL Fiddle도 포함시켰습니다.
http://sqlfiddle.com/#!17/5059f/9
읽어 주셔서 감사합니다! 더 많은 컨텐츠를 원하신다면,
표지 사진 작성자: Berkay Gumustekin on Unsplash
✌️
Reference
이 문제에 관하여(면접 합격에 도움이 되는 SQL 연습 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/abdisalan_js/sql-practice-question-newest-dog-owner-45m1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)