経験豊富な専門家のためのSQLインタビューの質問

ソースノード: 1586233

経験豊富な専門家のためのSQLインタビューの質問
 

概要

 
あなたが仕事を探している経験豊富なデータサイエンティストなら、これ以上の時間を選ぶことはできません。 現在のところ、多くの確立された組織は、自分たちの技術を内外で知っているデータサイエンティストを探しています。 ただし、需要が高いということは、特定のスキルセットがなくても、フープを飛び越えて上級職に応募できる、または応募する必要があるという意味ではありません。 経験豊富なデータサイエンティストを採用する場合、企業は彼らが目前の最も困難なタスクに取り組むことを期待しています。 これらの従業員は、必要なときに使用できるように、最もあいまいな機能もよく理解している必要があります。

上級職の面接では、経験豊富なデータサイエンティストが、はるかに難しい質問をされる傾向があることは驚くべきことではありません。 多くの場合、データサイエンティストは、XNUMXつの仕事に数年間取り組むと、特定の反復的なタスクを実行するのに非常に熟練します。 専門家にとって、SQLは既存の知識で終わらないことを理解することが不可欠です。 高度なSQLの概念に関しては、まだ知識にギャップがある可能性があります。 したがって、データサイエンティストの面接で成功するための助けを得ることは害にはなりません。 

SQLはデータベースを管理するための主要な言語であるため、SQL操作の実行はデータサイエンティストの仕事の中心です。 ほとんどのデータサイエンティストの面接は、候補者のSQLに関する知識を判断するために用意されています。 

日常の仕事には複雑な質問を書くことは含まれないかもしれませんが、そのようなスキルが必要な場合は、あなたがそれを実行できる人であることを示さなければなりません。 したがって、インタビュアーがさまざまなセットを尋ねることは驚くべきことではありません SQLインタビューの質問 SQLでの候補者の流暢さをテストします。

この記事では、経験豊富な専門家へのインタビューで尋ねられた複雑な質問と概念のいくつかを要約したいと思いました。 SQLの知識に自信がある場合でも、キーワードをスキャンして、すべてが網羅されていることを確認しても問題ありません。

経験豊富な専門家のための最低限の概念

ケース/いつ

 
SQLを完全に習得するには、CASEの概念(およびそれに付随するWhenステートメント)を完全に理解することが不可欠です。 caseステートメントを使用すると、特定の条件をチェックし、それらの条件がtrueまたはfalseと評価されたかどうかに基づいて値を返すことができます。 WHEREやORDERBYなどの句と組み合わせて、CASEを使用すると、ロジック、条件、および順序をSQLクエリに組み込むことができます。

CASEステートメントの値は、クエリで単純な条件付きロジックを提供することに限定されません。 経験豊富なデータサイエンティストは、CASEステートメントとその使用法について表面レベル以上の理解を持っている必要があります。 インタビュアーは、さまざまなタイプのCASE式とその記述方法について質問する可能性があります。 

経験豊富な候補者は、ValuedCASEステートメントとSearchedCASEステートメントの違い、それらの機能、およびそれらの記述方法を説明するなど、理論的な質問に答える準備をする必要があります。 これには、それらの構文と一般的な方法を十分に理解している必要があります。 言うまでもなく、これにはELSE句の適切な使用も含まれます。

経験豊富なデータサイエンティストは、集計関数でCASEを使用する方法も知っていることが期待されます。 また、繰り返しが少なく、理解しやすい簡略化されたCASEステートメントを作成するように求められる場合があります。 省略形のCASEステートメントを使用する場合の警告と考えられるリスクについてインテリジェントに話すことができるはずです。

一般に、経験豊富なデータサイエンティストは、CASEを使用してより効率的なクエリを作成できる必要があります。 結局のところ、CASEステートメントの全体的な目的は、データを統合するためにあまりにも多くの個別のクエリを記述しないようにすることです。

CASE / WHENステートメントを使用して解決できる質問の例を次に示します。 https://platform.stratascratch.com/coding/9634-host-response-rates-with-cleaning-fees?python= 

これはAirbnbのインタビューで尋ねられる難しい質問であり、候補者は平均的なホストの応答率、郵便番号、およびそれに対応する清掃料金を見つける必要があります。

この場合、CASE / WHENステートメントを使用して、結果を数値としてフォーマットし、郵便番号に加えてパーセンテージ値として表示します。

SQLジョイン

 
SQL結合についての知識に自信を持つのは簡単ですが、このトピックを詳しく調べるほど、自分が知らないことに気付くでしょう。 インタビュアーはよく尋ねます SQL結合の高度な側面に関する質問へのインタビュー それはしばしば見落とされます。 したがって、この概念を掘り下げて徹底的に習得することが重要です。
 
基本的な概念に加えて、インタビュアーは自己クロス結合とは何かを尋ね、実際的な質問を解決するように依頼することで知識の深さを知ることができます。 ハッシュ結合や複合結合などのより複雑なタイプを含む、さまざまなタイプの結合をすべて知っておく必要があります。 また、自然結合とは何か、およびそれらが最も役立つ場合について説明するように求められる場合もあります。 自然結合と内部結合の違いを説明する必要がある場合があります。
 
一般に、目的の結果を達成するには、結合を他のステートメントと組み合わせて使用​​することについて、十分な経験と習熟度を持っている必要があります。 たとえば、WHERE句を使用して、内部結合であるかのようにクロス結合を利用する方法を知っておく必要があります。 また、サーバーに過度の負荷をかけることなく、結合を使用して新しいテーブルを作成する方法を知っていることも求められます。 または、データベースにクエリを実行するときに、外部結合を使用して欠落している値を識別して入力する方法。 または、順序を並べ替えると出力が変わる可能性があるなど、外部結合の内部動作。 

これは、内部共同ステートメントを書くことを含む質問の例です

これはかなり難しい質問であり、候補者は注文サイズを総支出のパーセンテージとして表示するように求められます。
 
 

高度な概念N1:日時操作

 
経験豊富な専門家のためのSQLインタビューの質問
 

データベースには日付と時刻が含まれているのが一般的であるため、経験豊富なデータサイエンティストは、データベースの操作について深い知識を持っている必要があります。 このタイプのデータを使用すると、イベントが発生する順序、頻度の変化を追跡し、間隔を計算し、その他の重要な洞察を得ることができます。 多くの場合、これらの操作を実行するには、SQLでの日時操作を完全に習得する必要があります。 したがって、そのような一連のスキルを持つ専門家は、競合する候補者よりも有利になります。 自分のスキルに100%自信がない場合は、以下で説明する概念を調べて、どれだけの概念に慣れているかを確認してください。

SQLでデータをフォーマットするには、さまざまな(ただし有効な)アプローチがあるため、優れたコーダーは少なくともそれらすべてに精通している必要があります。 面接では、採用担当マネージャーは、基本的なデータフォーマットの概念に関する知識と、タスクに適した機能の選択についてインテリジェントに話す能力を期待しています。 これには、重要なFORMAT()関数と、関数を最大限に活用するための関連する構文に関する知識が含まれます。 NOW()などの他の基本関数の知識も必要です。 また、経験豊富な専門家が時系列データやその目的などの基本的な概念について質問されるのは当然のことです。

応募する仕事の文脈を考慮することも重要です。 AIまたはIoT企業は、センサーから収集されたデータの追跡に関心がありますが、株式取引アプリでは、日、週、または月の価格変動を追跡する必要がある場合があります。

場合によっては、雇用主は、CAST()、EXTRACT()、またはDATE_TRUNC()などのSQLのより高度な日付/時刻関数について質問することがあります。 これらの関数は、日付を含む大量のデータを処理する場合に非常に役立ちます。 経験豊富なデータサイエンティストは、各機能の目的とそのアプリケーションを知っている必要があります。 理想的なシナリオでは、彼または彼女は過去にそれらを使用した経験を持っている必要があります。

SQLでの最も複雑な日時操作には、基本機能と高度な機能の組み合わせが含まれます。 したがって、より基本的なFORMAT()、NOW()、CURRENT_DATE、およびCURRENT_TIMEから始めて、上記のより高度な関数を含めて、それらすべてを知る必要があります。 経験豊富なデータサイエンティストとして、INTERVALの機能と使用時期も知っておく必要があります。

Airbnbのインタビューで尋ねられた質問の例を次に示します、候補者はAirbnbの成長を追跡するために利用可能なデータを使用する必要があります。
 
 

前提:

 
この質問では、候補者は、毎年サインアップするホストの数の変化に基づいて、Airbnbの成長を追跡するように求められます。 つまり、毎年の成長の指標として、新しく登録されたホストの数を使用します。 昨年と当年度のホスト数の差を計算し、その数を前年に登録されたホスト数で割ることにより、成長率を求めます。 次に、結果に100を掛けて、パーセンテージ値を求めます。

出力テーブルには、今年、前年のホスト数、および年ごとの成長率の列と対応するデータが含まれている必要があります。 パーセンテージは最も近い整数に丸める必要があり、行は年に応じて昇順で並べ替える必要があります。
 
 

解決法:

 
この質問に答えるには、候補者は多くの列を含む「airbnb_search_details」というテーブルで作業する必要があります。 必要な列には「host_since」というラベルが付いています。これは、ホストが最初にWebサイトにサインアップした年、月、および日を示します。 この演習では、月と日は関係ないため、最初に行う必要があるのは、値から年を抽出することです。 次に、今年、前年、およびその年のホストの総数の個別の列を含むビューを作成する必要があります。 

抽出を選択します (年 FROM host_since::DATE) FROM airbnb_search_details WHERE host_since IS NOT NULL

これまでに、XNUMXつのことを実行しました。

  1. host_since列が空でない行のみを含めるようにしました。
  2. データから年を抽出し、それをDATE値としてキャストしました。
extract(year FROM host_since::DATE) count(id) を current_year_host FROM airbnb_search_details WHERE host_since IS NOT NULL GROUP BY extract(year FROM host_since::DATE) ORDER BY year asc を選択します

次に、IDのカウントに進み、毎年GROUPBY句を設定します。 そして、昇順で表示させます。 

これにより、年とその年に登録されたホストの数のXNUMXつの列を持つテーブルが得られます。 質問を解決するために必要な全体像はまだありませんが、それは正しい方向への一歩です。 また、前年にサインアップしたホスト用に個別の列が必要です。 これがLAG()関数の出番です。

SELECT Year, current_year_host, LAG(current_year_host, 1) OVER (ORDER BY year) as prev_year_host 選択 extract(year FROM host_since::DATE) count(id) as current_year_host FROM airbnb_search_details WHERE host_since IS NOT NULL GROUP BY extract(year FROM host_since: :DATE) ORDER BY 年 asc

ここでは、「prev_year_host」というラベルの付いたXNUMX番目の列を追加しました。その値は、XNUMX行の遅延を除いて、「current_year_host」から取得されます。 これは次のようになります。

経験豊富な専門家のためのSQLインタビューの質問
 

このようにテーブルを配置すると、最終的な成長率を計算するのに非常に便利です。 方程式の値ごとに個別の列があります。 最終的に、コードは次のようになります。

SELECT year, current_year_host, prev_year_host, round(((current_year_host - prev_year_host)/(cast(prev_year_host AS numeric)))*100) 推定成長 FROM (SELECT year, current_year_host, LAG(current_year_host, 1) OVER (ORDER BY year) AS prev_year_host FROM (SELECT extract(year FROM host_since::date) AS year, count(id) current_year_host FROM airbnb_search_details WHERE host_since IS NOT NULL GROUP BY extract(year FROM host_since::date) ORDER BY year) t1) t2

ここでは、別のクエリと、成長率を計算する別の列を追加します。 タスクの要件を満たすには、初期結果に100を掛けて、丸める必要があります。 

これがこのタスクの解決策です。 タスクを完了するために日時操作機能が不可欠であることは明らかです。 
 
 

Advanced Concept N2:ウィンドウ関数とパーティション

 
経験豊富な専門家のためのSQLインタビューの質問
 

SQLウィンドウ関数 は、複雑でありながら効率的なSQLクエリを作成するための最も重要な概念のXNUMXつです。 経験豊富な専門家は、ウィンドウ関数に関する深い実践的および理論的知識を持っていることが期待されます。 これには、over句が何であるかを知り、その使用法を習得することが含まれます。 インタビュアーは、OVER句が集計関数をウィンドウ関数に変換する方法を尋ねる場合があります。 また、ウィンドウ関数として使用できるXNUMXつの集計関数について質問される場合があります。 経験豊富なデータサイエンティストは、他の非集計ウィンドウ関数にも注意する必要があります。

ウィンドウ関数を最大限に活用するには、PARTITIONBY句とは何かとその使用方法も知っておく必要があります。 それを説明し、いくつかのユースケースの例を提供するように求められる場合があります。 場合によっては、ORDER_BY句を使用してパーティション内の行を整理する必要があります。

ROW_NUMBER()など、個々のウィンドウ関数の完全な知識を示すことができる候補者には利点があります。 言うまでもなく、理論的な知識だけでは十分ではありません。専門家は、パーティションの有無にかかわらず、実際にそれらを使用した経験も必要です。 たとえば、経験豊富な専門家は、RANK()とDENSE_RANK()の違いを説明できる必要があります。 理想的な候補者は、パーティション内のフレームなど、最も高度な概念のいくつかを知っており、それらを明確に説明できる必要があります。

優れた候補者は、NTH_VALUE()関数の使用についても説明する必要があります。 FIRST_VALUE()関数やLAST_VALUE()関数など、この関数の代替案について言及しても問題ありません。 多くの場合、企業は一般的に四分位数、分位数、およびパーセンタイルを測定することを好みます。 この操作を実行するには、データサイエンティストは、NTILE()ウィンドウ関数の使用方法も知っている必要があります。

SQLでは、通常、タスクにアプローチする方法はたくさんあります。 それでも、ウィンドウ関数は、一般的ですが複雑な操作を実行するための最も簡単な方法を提供します。 このようなウィンドウ関数の良い例はLAG()またはLEAD()であるため、これらにも精通している必要があります。 たとえば、Airbnbの難しいインタビューの質問に対する前の解決策の例を見てみましょう。

前年のホスト数を表示するために、OVERステートメントでLAG()関数を使用しました。 これは他の多くの方法で行うことができましたが、ウィンドウ関数を使用すると、SQLコードのXNUMX行だけで目的の結果を得ることができました。

LAG(current_year_host、1)OVER(ORDER BY year)as prev_year_host

多くの企業は、特定の期間の成長を計算する必要があります。 LAG()関数は、このような割り当てを完了するために非常に役立ちます。
 
 

Advanced Concept N3:月々の成長

 
経験豊富な専門家のためのSQLインタビューの質問
 

多くの組織は、データ分析を使用して独自のパフォーマンスを測定しています。 これには、特定の投資に対するマーケティングキャンペーンまたはROIの効果の測定が含まれる場合があります。 このような分析を実行するには、日付、時刻、ウィンドウ関数などのSQLに関する深い知識が必要です。

データサイエンティストは、データをフォーマットしてパーセンテージまたはその他の形式で表示するスキルも証明する必要があります。 一般に、月ごとの成長を計算する必要がある実際的な質問を解決するには、複数のスキルセットの組み合わせを使用する必要があります。 必要な概念のいくつかは高度なもの(ウィンドウ関数、日時操作)であり、その他の概念は基本的なもの(集約関数と一般的なSQLステートメント)です。

アマゾンのインタビュアーが尋ねた質問の例を見てみましょう。

前提:

 
この質問では、購入のテーブルを使用して、月ごとの収益の増加または減少を計算する必要があります。 最終結果は特定の方法(YYYY-MM形式)でフォーマットする必要があり、パーセンテージはXNUMX番目に近い小数点に丸める必要があります。 

解決法:

 
このようなタスクに取り組むとき、最初に行う必要があるのは、テーブルを理解することです。 また、質問に答えるために使用する必要のある列を特定する必要があります。 そして、あなたの出力はどのようになるか。

この例では、データ値にオブジェクトタイプがあるため、CAST()関数を使用してデータ値を日付タイプに変換する必要があります。

SELECT to_char(cast(created_at as date), 'YYYY-MM') FROM sf_transactions

この質問では日付の形式も指定されているため、SQLでTO_CHAR()関数を使用して、この形式で日付を出力できます。

成長を計算するには、created_atおよびSUM()集計関数も選択して、その日の総売上高を取得する必要があります。 

SELECT to_char(cast(created_at as date), 'YYYY-MM'), created_at, sum(value) FROM sf_transactions

この時点で、ウィンドウ関数を再度使用する必要があります。 具体的には、LAG()関数を使用して先月のボリュームにアクセスし、それを別の列として表示します。 そのためには、OVER句も必要です。

SELECT to_char(cast(created_at as date), 'YYYY-MM') AS year_month, created_at, sum(value) lag(sum(value), 1) OVER (ORDER BY created_at::date) FROM sf_transactions GROUP BY created_at

これまでに作成したコードに基づくと、テーブルは次のようになります。

経験豊富な専門家のためのSQLインタビューの質問
 

ここでは、合計列に日付と対応する合計値があり、ラグ列に最後の日付の値があります。 これで、値を数式にプラグインして、成長率を別の列に表示できます。

また、不要なcreated_at列を削除し、GROUPBY句とORDERBY句をyear_monthに変更する必要があります。

SELECT to_char(cast(created_at as date), 'YYYY-MM') AS year_month, sum(value), lag(sum(value), 1) OVER (ORDER BY to_char(cast(created_at as date)) FROM sf_transactions GROUP BY年月

コードを実行したら、テーブルには計算に不可欠な列のみを含める必要があります。

経験豊富な専門家のためのSQLインタビューの質問
 

これで、ようやく解決策にたどり着くことができます。 最終的なコードは次のようになります。

SELECT to_char(created_at::date, 'YYYY-MM') AS year_month, round(((sum(value) - lag(sum(value), 1) OVER w) / (lag(sum(value), 1) OVER w)) * 100, 2) AS Revenue_diff_pct FROM sf_transactions GROUP BY year_month WINDOW w AS ( ORDER BY to_char(created_at::date, 'YYYY-MM')) ORDER BY year_month ASC


 

このコードでは、前の例からXNUMXつの列の値を取得し、それらの差を計算します。 コードの繰り返しを減らすために、ウィンドウエイリアスも使用していることに注意してください。

次に、アルゴリズムに従って、それを今月の収益で割り、100を掛けてパーセンテージ値を取得します。 最後に、パーセンテージ値を小数点以下XNUMX桁に丸めます。 タスクのすべての要件を満たす答えに到達します。 

Advanced Concept N4:解約率

 
成長の反対ですが、解約も重要な指標です。 多くの企業は、特にビジネスモデルがサブスクリプションベースの場合、解約率を追跡しています。 このようにして、失われたサブスクリプションまたはアカウントの数を追跡し、それを引き起こした理由を予測できます。 経験豊富なデータサイエンティストは、解約率の計算に使用する関数、ステートメント、および句を知っていることが期待されます。

サブスクリプションデータは非常にプライベートであり、プライベートユーザー情報が含まれています。 データサイエンティストにとって、そのようなデータを公開せずに操作する方法を知ることも重要です。 多くの場合、解約率の計算には、比較的新しい概念である一般的なテーブル式が含まれます。 最高のデータサイエンティストは、CTEが有用である理由とそれらをいつ使用するかを知っている必要があります。 CTEが利用できない古いデータベースで作業する場合でも、理想的な候補者は仕事を成し遂げることができるはずです。

これが難しいタスクの例です。 Lyftで面接する候補者は、会社でのドライバーの解約率を計算するためにこの割り当てを受け取ります。

この問題を解決するには、データサイエンティストは、case / whenステートメント、LAG()などのウィンドウ関数、FROM / WHERE、およびその他の基本的な句を使用する必要があります。 

まとめ

 
長年データサイエンティストとして働いていることは確かに履歴書で印象的であり、あなたに多くのインタビューを得るでしょう。 ただし、ドアに足を踏み入れた後も、長年の経験を補完するために知識を表示する必要があります。 幅広い経験があっても SQLでクエリを書く、次のようなリソースを使用しても問題ありません ストラタスクラッチ あなたの知識をリフレッシュするために。

 
 
ネイト・ロシディ データサイエンティストであり、製品戦略に携わっています。 彼はまた、分析を教える非常勤教授であり、 ストラタスクラッチ、データサイエンティストがトップ企業からの実際の面接の質問で面接の準備をするのを支援するプラットフォーム。 彼とつながる Twitter:StrataScratch or LinkedIn.

ソース:https://www.kdnuggets.com/2022/01/sql-interview-questions-experienced-professionals.html

タイムスタンプ:

より多くの KDナゲット