過去6年間、私は多くの就職面接に参加してきました – テーブルの両側で。 その中で最も楽しく、また最も恐れられているのが、技術審査です。 この記事では、私の経験上、データアナリストの面接でよく行われる3つのSQLテスト演習を紹介します。 (そして、これらは SQL インタビューの質問の「サンプル」ですが、現実に大きく基づいています!)
Before the tasks – What can you expect in an SQL technical screening?
There are two common ways an SQL tech screening can be done.
The simpler but less common way is you get a computer, a data set and a task.All Rights Reserved. あなたがタスクを解決している間、面接官は見ていて、質問をします。
もうひとつの、より難しい(そして、より一般的な)方法は、ホワイトボード面接です。 この場合、コンピュータを手に入れることはできません。 課題を解き、ホワイトボードにコードをスケッチしなければなりません。 つまり、コードに論理的なミスや構文的なミスがあっても、(少なくともコンピュータからの)フィードバックは得られないのです。 もちろん、反復的に考えることでタスクを解決することはできますが (異なる SQL 問題を 1 つずつ解決していく)、自分の SQL スキルに非常に自信がある必要があります。 もしかしたら、3~5分の思考時間が得られるかもしれませんが、それが最大限の期待値です。 その分、比較的簡単なタスクが出るのが良いところです。 (下記の難易度を参照してください!)
注意: 他のタイプの技術審査 – 持ち帰り課題のような – もあり、そこではより複雑なコーディングの課題を解決できることを証明できます。
Test yourself!
ここでは、私がデータアナリスト/サイエンティストの就職面接で実際に受けたり出したりしたものに本当に近いSQL面接質問を3つ紹介します!
ホワイトボード面接のように、すべて解いてみてください!
記事の後半では、解決方法も紹介します!
SQL面接質問1
2つのSQLテーブルがあるとしましょう。 authors
とbooks
です。authors
のデータセットには1M以上の行がありますが、ここに最初の6行があります。
author_name | book_name |
author_1 | book_1 |
author_1 | book_2 |
author_2 | book_3 |
author_2 | book_4 |
author_2 | book_5 |
author_3 | book_6 |
・・・となる。 | … |
books
データセットも1M以上の行があり、最初の6行はこちらです。
book_name | sold_copies |
book_1 | 1000 |
book_2 | 1500 |
book_3 | 34000 |
book_4 | 29000 |
book_5 | 40000 |
book_6 | 4400 |
・・・・。 | … |
総売上冊数の多い著者TOP3を表示するSQLクエリを作成します!
(注:スウェーデンの非常に有名なIT企業のデータサイエンティスト職で、とてもとても似たSQL面接質問を受けました。)
SQL面接質問#2
あなたはオンラインのプレゼンテーションソフトウェアを作るスタートアップで働きます。 あなたは、ユーザーがプレゼンテーションに画像を挿入するたびに記録するイベントログを持っています。 (一人のユーザーは複数の画像を挿入することができます。event_log
SQL テーブルは次のようになります。
user_id | event_date_time | ||
7494212 | 1535308430 | ||
7494212 | 1535308433 | ||
1475185 | 1535385 | ||
1535308433 | 1535308430 | 1535308430 | 15353084301535308444 |
6946725 | 1535308475 | ||
6946725 | 1535308476 | ||
6946725 | 1535308477 | ||
… | … |
…と、10億行を超える行数があります。
注意: event_date_time
列のフォーマットが見慣れない場合は、「epoch timestamp」でググってください!
プレゼンテーションに 1000 以上、2000 以下の画像を挿入したユーザーの数を調べるために SQL クエリを書いてください!このクエリを実行するためには、次のようにします。
(注:私がフリーランスで、顧客が採用プロセスで助けを必要としていたとき、データアナリストをテストするために個人的にこのインタビュー質問を作成し、使用しました。)
SQL Interview Question #3
あなたは2つのSQLテーブルを持っています!
あなたはそのうちの1つです。 最初のものはemployees
と呼ばれ、会社の従業員名、ユニークな従業員ID、部署名が含まれています。 サンプルです。
department_name | employee_id | employee_name |
Sales123 | John Doe | |
Sales | 211 | Jane Smith |
HR | 556 | Billy Bob |
Sales | 711 | Robert Hayek |
Marketing | 235Edward Jorgson | |
Marketing | 236 | Christine Packard |
… | … |
2番目はsalaries
という名前です。 これは同じ従業員名と同じ従業員ID、そして各従業員の給料を保持しています。 サンプルです。
salary | employee_id | employee_name |
500 | 123 | John Doe |
600 | 211 | Jane Smith |
1000 | 556 | ビリー・ボブ |
400 | 711 | ロバート・ハイエク |
1200 | 235 | Edward Jorgson |
200 | 236 | Christine Packard |
・・・・。 | … |
会社の従業員は546人なので、両方のテーブルには546行があることになります。
従業員あたりの平均給与が500ドルより低いすべての部門を印刷します!
(注:このテスト問題は、ある最大のソーシャルメディア企業(名前は「F」で始まる)に応募した友人から聞いた実際のSQL面接の質問に基づいて作成しました。
Solution of SQL Interview Question #1
解答コードは以下の通りです:
SELECT authors.author_name, SUM(books.sold_copies) AS sold_sumFROM authorsJOIN booksON books.book_name = authors.book_nameGROUP BY authors.author_nameORDER BY sold_sum DESCLIMIT 3;
そして、以下は短い説明です:
1. まずJOIN
を開始する必要があります。 私は2つのテーブルを
SELECT *FROM authorsJOIN booksON books.book_name = authors.book_name;
2を使用して結合しました。 その後、GROUP BY
句を持つSUM()
関数を使用しました。 つまり、SELECT
ステートメントで、*
を author_name
と sold_copies
カラムに置き換える必要があったのです。 (どのテーブルからカラムを選択するかを示すことは必須ではありませんが、その価値はあります。 そのため、authors.author_name
とbooks.sold_copies
を使いました。)
3. 結局、ORDER
結果をDESC
順に並べました。 (便宜上、SELECT
文のAS sold_sum
メソッドでsum
列の名前もsold_sum
に変更しました。)
SQLインタビュー質問2
SQLクエリの解決方法は、
SELECT COUNT(*) FROM (SELECT user_id, COUNT(event_date_time) AS image_per_user FROM event_log GROUP BY user_id) AS image_per_userWHERE image_per_user < 2000 AND image_per_user > 1000;
このタスクのコツは、COUNT()
機能を2回使用しなければならないことです:最初に、ユーザーごとの画像数を数え、続いて(与えられた条件を満たす)ユーザー数量を数えなければならなかったのです。 これを行う最も簡単な方法は、サブクエリを使用することです。
- 最初に内部クエリを書いてください。
event_log
テーブル上でGROUP BY
節を持つ単純なCOUNT()
関数を実行します。 - サブクエリのエイリアス (
AS image_per_user
) を作成することを確認します。 これはSQLの構文要件です。 - 最終的には、外部クエリで、サブクエリの結果に対して
WHERE
フィルタとCOUNT()
関数を適用してください。
Solution of SQL Interview Question #3
Solution:
SELECT department_name, AVG(salaries.salary) AS avg_salariesFROM employeesJOIN salariesON employees.employee_id = salaries.employee_idGROUP BY department_nameHAVING AVG(salaries.salary) < 500;
注意:サブクエリを使用してこのタスクを解くこともできます – しかしインタビューの状況では委員会は上記のソリューションをより好むでしょう。
Brief explanation:
1.
SELECT *FROM employeesJOIN salariesON employees.employee_id = salaries.employee_id
注意! employee_name
ではなく、employee_id
列を使用します。 (1つの会社に2人のJohn Doesを持つことはできますが、社員IDは一意です!)
2. 次に、AVG()
関数とGROUP BY
句を使用し、*
を適切な列で置き換えてください。 (最初のタスクと同じように。)
3. そして最後のステップは、AVG()
関数の結果でフィルタするためにHAVING
句を使用することです。 (覚えておいてください。 WHERE
は AVG()
関数の前に開始されるので、ここではよくありません。)
気をつけてください: HAVING
行では、エイリアスを参照することはできません – 関数自体をもう一度使用しなければなりません!
SQL 技術審査に備えるには、練習をしましょう!
HAVING
行では、エイリアスを参照することはできません。
これらの問題をすべて適切に解くことができたなら、あなたはおそらくジュニアレベル、あるいはミッドレベルのデータアナリストのSQL技術審査に合格する準備ができています。 データサイエンティストを目指す人のためのSQL(7日間オンラインコース) – 7日間でSQLのスキルをレベルアップ(またはブラッシュアップ)することができます。 コースが終了したら、この記事に戻ってきてください。これらの質問が解けるようになることを保証します!
SQL for Aspiring Data Scientists (7-day online course)
また、これからSQLを始める方は、ブログのSQL For Data Analysisシリーズから始めてください!
まとめ
これらのSQLインタビューの質問の難しい部分は、それらが抽象的であるということです。 タスクでは「データセットを想像してください」と言われ、その数行だけを見せられます。 このような演習を受ける場合、以前に同じようなデータセットを見て、同じような問題を解いたことがあると、とても役に立ちます。 この記事のタスクを解くことで自信がつくといいですね!
。