SQLの面接の質問。 3つの技術審査演習(データ アナリスト向け)

過去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テーブルがあるとしましょう。 authorsbooksです。
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 テーブルは次のようになります。

1535308430

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_namesold_copies カラムに置き換える必要があったのです。 (どのテーブルからカラムを選択するかを示すことは必須ではありませんが、その価値はあります。 そのため、authors.author_namebooks.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回使用しなければならないことです:最初に、ユーザーごとの画像数を数え、続いて(与えられた条件を満たす)ユーザー数量を数えなければならなかったのです。 これを行う最も簡単な方法は、サブクエリを使用することです。

  1. 最初に内部クエリを書いてください。 event_log テーブル上で GROUP BY 節を持つ単純な COUNT() 関数を実行します。
  2. サブクエリのエイリアス (AS image_per_user) を作成することを確認します。 これはSQLの構文要件です。
  3. 最終的には、外部クエリで、サブクエリの結果に対して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句を使用することです。 (覚えておいてください。 WHEREAVG() 関数の前に開始されるので、ここではよくありません。)
気をつけてください: HAVING 行では、エイリアスを参照することはできません – 関数自体をもう一度使用しなければなりません!

SQL 技術審査に備えるには、練習をしましょう!
HAVING 行では、エイリアスを参照することはできません。

これらの問題をすべて適切に解くことができたなら、あなたはおそらくジュニアレベル、あるいはミッドレベルのデータアナリストのSQL技術審査に合格する準備ができています。 データサイエンティストを目指す人のためのSQL(7日間オンラインコース) – 7日間でSQLのスキルをレベルアップ(またはブラッシュアップ)することができます。 コースが終了したら、この記事に戻ってきてください。これらの質問が解けるようになることを保証します!

SQL for Aspiring Data Scientists (7-day online course)

また、これからSQLを始める方は、ブログのSQL For Data Analysisシリーズから始めてください!

まとめ

これらのSQLインタビューの質問の難しい部分は、それらが抽象的であるということです。 タスクでは「データセットを想像してください」と言われ、その数行だけを見せられます。 このような演習を受ける場合、以前に同じようなデータセットを見て、同じような問題を解いたことがあると、とても役に立ちます。 この記事のタスクを解くことで自信がつくといいですね!

コメントを残す

メールアドレスが公開されることはありません。