よくある質問 SQL ウィンドウ関数のインタビュー

写真

面接の質問

「学生成績テーブル」があり、クラス ID、学生 ID、コース ID、成績の 4 つのフィールドが含まれています。

ここに画像の説明を挿入

質問 1:各生徒の最高成績の 3 つの記録を見つけます。

問題 2:各コースの成績がクラス平均より高い学生を求めます

テクノロジーのアップグレード

テクノロジーは共有とコミュニケーションを学ぶ必要があり、密室で作業することはお勧めできません。人はより速く進むことができ、人々のグループはより遠くへ進むことができます。

ここでは、データ分析インタビューの質問のコレクションを整理しています。さらに、記事内のソース コード、情報、データ、技術交換の改善点は、Knowledge Planet 交換グループを追加することで入手できます。グループ メンバーは 2,000 人以上です。追加するときは、ソース + 興味の方向をメモに追加することを忘れないでください。同じ考えを持つ友人を簡単に見つけることができます。

方法①、WeChatアカウントを追加:pythoner666、備考:CSDN+面接の質問より
方法②、WeChat検索公式アカウント:Python学習とデータマイニング、バックグラウンド返信:グループ追加

【問題解決の手順】

1. トップNの問題

問1は一般的なランキング問題(topN問題)であり、このようなビジネス上の問題を解決するにはSQLウィンドウ関数の利用を考える必要があります。

window関数で取得する順序には、rank()、dense_rank()、row_number()の3種類があります。

また、「値」によって小さいものから大きいものまで並べ替えられており、3 つの違いは次のとおりです。

ここに画像の説明を挿入

問題の説明によると、dense_rank ウィンドウ関数を使用する必要があります。

select *
from (
select *,
       dense_rank() over (partition by 班级id,学生id 
       order by 成绩 desc) as 顺序
from 学生成绩表
) t1
where 顺序 <= 3;

検索結果:

ここに画像の説明を挿入

2. 概要分析

質問 2 では、各コースのスコアがクラスの平均より高い学生を見つけるよう求められます。質問は次の質問に分類できます。

1) 各クラス、各コースの平均点を求める

2) クラス内の対応するコースの平均スコアから各コースの学生の成績を引きます。結果が 0 より大きい場合、このコースの学生の成績がコースの平均スコアより高いことを意味します。

3) 「授業のスコアがクラスの平均より高い学生を見つける」とは、学生の最小の「減算結果」が 0 より大きいことを意味します。

まず、概要分析を使用して、各クラスおよび各コースの平均スコアを見つけます。

select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id;

検索結果:

ここに画像の説明を挿入

3. 複数テーブルの結合

複数テーブルのクエリが関係する場合は、複数テーブルの結合が必要です。

ここでの目的は、「クラス内の対応するコースの平均点から、各コースの生徒の成績を引く」ことです。

そこで、元の「生徒の成績表」と「クラスの平均成績」を結合することになります。

左側のテーブル「生徒成績表」にすべてのデータを残すには、「コース平均」×から生徒全員の成績を差し引くので、「左結合(左結合)」を選択します。

ここに画像の説明を挿入

select t1.班级id,t1.学生id,t1.课程id,t1.成绩,
       t1.成绩 - t2.课程平均分 as 相减结果
from 学生成绩表 t1
left join (
select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id
) t2 on t1.班级id = t2.班级id and t1.课程id = t2.课程id;

ここに画像の説明を挿入

最後に、グループの概要を使用し、having 条件を組み合わせて、「減算結果の最小値が 0 より大きい」生徒を除外します。

select 班级id,学生id
from (
select t1.班级id,t1.学生id,t1.课程id,t1.成绩,
       t1.成绩 - t2.课程平均分 as 相减结果
from 学生成绩表 as t1
left join (
select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id
) as t2 on t1.班级id = t2.班级id and t1.课程id = t2.课程id
) as tmp
group by 班级id,学生id
having min(相减结果) > 0;

ここに画像の説明を挿入

この問題のテストポイント

1. グループ化と要約の理解を検討し、ビジネス上の問題を解決するために柔軟に使用します。

2. 複数テーブル結合の理解を検討し、それらを柔軟に使用してビジネス上の問題を解決します。

3) 窓関数の理解を調べる 窓関数で解決できる古典的な問題はほんのわずかですが、それを書き留めれば、ビジネス上の問題の 99% を解決できます。

おすすめ

転載: blog.csdn.net/m0_59596937/article/details/130298507