면접 합격에 도움이 되는 SQL 연습 문제

11919 단어 sqltutorial
내가 수행한 50개 이상의 프로그래밍 인터뷰에서 두 개의 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

✌️

좋은 웹페이지 즐겨찾기