SQL学習(4):JD面接試験問題の振り返り

SQL学習(4):JD面接試験問題の振り返り

面接の振り返り、まとめと学び

1.面接問題の概要

このセクションでは、面接の振り返りを含む問題とその回答を記録します。 今回のポジションは主にビッグデータ、HiveSQL、SparkSQLに関連し、個人のスキルセットにはMySQLが含まれます。

  • プロセス、質問、回答および振り返り
  1. 自己紹介:

学校・専攻、インターン経験について簡潔に説明。MATLABとMySQLに精通していることを述べ、PythonやRを使った2つのコースプロジェクトを経験したが、まだ熟練していないと述べた。英語力と性格についても言及。 2. 面接官による業務技術の概要(順不同): 主にビッグデータ、特にHiveSQLに関わっているとのことで、次の質問はSQLに関するものになる。 3. 売上テーブルがあり、チャネルと金額がある場合、各チャネルの合計金額を得るにはどうすればよいか: 回答:select sum(金額) … group by チャネル 4. 学生情報テーブルがあり、学生、日付、科目、成績が含まれる。昨日より今日の成績が良い学生情報を取得するにはどうすればよいか: 回答:自己結合後に成績比較、または前日の日付を特定して成績比較を行う。

追加質問:自己結合の仕方について 回答:サブクエリを使用する

もう一度追加質問:サブクエリを使わずには? 回答:DATEDIFFの引数にサブクエリを使おうとしたが、方法が分からなかった

振り返り:正しく答えられていなかった。実際にはサブクエリを使わなくても可能。サブクエリはコード構造を複雑にし、より良い選択肢があればそれを避けるべき。 5. 行転列や列転行を知っているか: 回答:聞いたことはあるが、実際に扱ったことはない

振り返り:面接官は今後頻繁に使用される技術だと述べ、学習すべきであると指摘。 6. union all と union の違い: 回答:一方は重複を除去して連結、もう一方はそのまま連結

振り返り:より正確にどちらがどの効果を持つのかを説明すべきだった。自信がなく、知識が不十分だった。 7. 注文テーブルがあり、ユーザーと注文日時が含まれる。最初の注文を取得するにはどうすればよいか: 回答:単一ユーザーの場合、WHEREでユーザーをフィルタリングし、SELECTでMINまたはORDER BYとLIMIT 1を使う。複数ユーザーの場合、GROUP BYでユーザーごとに処理。

追加質問:複数ユーザーの場合は問題があるか 回答:rank() over(partition by ユーザー order by 日時)を使ってrank=1の情報を選択

確認:rankとrow_numberの違い 回答:3つの順序関数がある。一つは連続した番号、もう一つは同じ値の場合でも連続で番号を振る、最後は同じ値の場合でも番号をスキップする

振り返り:ケースごとに分けるのは良いが、細部に注意すべきだった。実務ではより堅牢な解決策が必要だが、面接では時間を稼ぐためにケース分けができれば得点できる。 8. 金融・経済に関する知識があるか 回答:学部で関連する授業を受けており、基礎知識はある。習得は容易であると述べた

振り返り:知識がない場合は誠実に伝えるべきであり、自分の強み(基礎がある、習得が容易、学習意欲ありなど)をアピールすべきだった。 9. 企業レベルのデータ処理経験はあるか 回答:なし。課題プロジェクトでは4000〜70000件のデータを扱った 10. 質問:何か質問がありますか ワーク内容におけるビッグデータ技術について 回答:主にSQLの使用が中心。そのためSQLの習熟が必要。ビッグデータの知識は概要レベルにとどまる。

振り返り:技術的な質問がある場合は、事前に考えられなかった問題を確認するのに良い。 11. 更に:修士課程でのビッグデータ計算に関する内容は?実際には多くの計算知識が含まれるか 回答:そうではない。主にビッグデータの基礎紹介、MapReduceやHadoopなどの概要。計算部分はテキスト分析、グラフ理論、クラスタリングなどのアルゴリズムに焦点を当てている。

2.問題の振り返り

特に4と7の実践問題について振り返る

  1. 学生情報テーブルがあり、学生、日付、科目、成績が含まれる。昨日より今日の成績が良い学生情報を取得するにはどうすればよいか

主な難点は「今日」と「昨日」の概念が同じテーブル内で扱われるという点。

最も直感的な方法はテーブルの自己結合で、すべての日付差を計算し、日付差が1日のデータを選択して成績比較を行う。

この方法のポイントは、ON条件の選択

  • nameで結合すると、WHEREでDATEDIFF関数を使用する必要があり、煩雑になる。
  • 実際には、ON条件に日付の演算や比較結果を含めることも可能
SELECT a.*
FROM student a JOIN student b 
ON DATEDIFF(a.s_time,b.s_time)=1
WHERE a.grade>b.grade

別の方法としてLAG()ウィンドウ関数を使用することも可能。これは自己結合と同等。

SELECT *
FROM 
	(SELECT *,LAG(grade) OVER(ORDER BY s_time) lag_grades 
	FROM student) t1
WHERE grade>lag_grades


  1. 注文テーブルがあり、ユーザーと注文日時が含まれる。最初の注文を取得するにはどうすればよいか

複数ユーザーに対してLIMITを使用すると問題がある。LIMITは他の処理が終了した後に実行されるため、1行しか得られない。

最もシンプルな解決法はMIN関数と複数テーブルの結合

注意点:

  • SELECT *, MIN(paid_time)のように使用すると、結果にMIN値が追加されるだけで、対応する列は得られない。
  • GROUP BY cust_idを使用した場合、SELECT cust_id, MIN(paid_time)はIDと該当する最小日時を取得できる。しかしSELECT *, MIN(paid_time)の場合は、グループ内の最初の行のみが返される。
  • GROUP BY cust_id, HAVING paid_time=MIN(paid_time)SELECT paid_time, MIN(paid_time)が必要だが、これは重複した日時列が発生する。
  • よって、各ユーザーの最初の取引日時のみが必要であればSELECT cust_id, MIN(paid_time) FROM customer_infoで十分。他の情報が必要な場合は通常、複数テーブルの結合が一般的。
SELECT c.user_id, mc.pt
FROM 
	(SELECT user_id, MIN(paid_time) AS pt
	 FROM customer_info
	 GROUP BY user_id) AS mc 
JOIN customer_info 

タグ: SQL HiveSQL SparkSQL MySQL データ分析

7月4日 19:28 投稿