PTA—SQL 補足質問 (4)

目次

各学校で GPA が最も低いクラスメートを検索する

テーブル構造:

テーブルサンプル

出力例:

現在の給与詳細と部門番号 dept_no を検索します。

説明

解答用紙のスコアが 80 を超える人のユーザー レベルの分布

説明

試験問題発売日の回答者数と平均点

テーブル構造:

テーブルサンプル

出力例:

 限定されたニックネーム実績有効日を使用してユーザーをフィルタリングする

説明


各学校で GPA が最も低いクラスメートを検索する

現在、各学校で最も低い GPA を持つ学生を検索して調査したいと考えています。各学校で最も低い GPA を取得してください。

ヒント: 回答には SELECT ステートメントを使用してください。

テーブル構造:

ここにテーブル構造を定義するSQL文を記述してください。例えば:


drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int 
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);

テーブルサンプル

上記のテーブル構造に対応するテーブルサンプルをここに提供してください。例えば

user_profile水面:

 

出力例:

ここにサンプル出力を提供してください。例えば:

6543|北京大学|3.200

4321|復旦大学|3.600

2131|山東大学|3.300

2315|浙江大学|3.600

  • 制限事項: gpa の最低値は min(gpa) のように見えますが、これは各学校の最低値であり、世界的な最低値ではないことに注意してください。min(gpa)に達すると、対応するクラスメートのIDが失われ、直接実行すると、最も低いgpaに対応する学生のIDを取得できなくなります。
  • group by を使用して学校をグループ化し、各学校の最小 GPA を計算し、この GPA と等しいこの学校の学生 ID を見つけます。最低 GPA が複数の学生に対応する場合は全員が出力されることに注意してください。タイトルでこの状況が明確にされない場合は、心理的に理解するだけにしてください。
SELECT device_id,university,gpa
FROM user_profile
WHERE (university,gpa) IN (SELECT university, min(gpa)
                FROM user_profile
                GROUP BY university)
ORDER BY university

現在の給与詳細と部門番号 dept_no を検索します。

説明

すべての従業員の給与プロファイルには、次のような給与表があります。

emp_no 給料 開始日 現在まで
10001 88958 2002-06-22 9999-01-01
10002 72527 2001-08-02 9999-01-01
10003 43311 2001-12-01 9999-01-01

各部門のリーダーシップ テーブル dept_manager の概要は次のとおりです。

部門番号 emp_no 現在まで
d001 10001 9999-01-01
d002 10003 9999-01-01

各部門の現在のリーダーの給与詳細と、対応する部門番号 dept_no を確認してください。出力結果は、salaries.emp_no の昇順にソートされており、出力結果の dept_no 列が最後の列であることに注意してください。上記の例は次のようになります。

emp_no 給料 開始日 現在まで 部門番号
10001 88958 2002-06-22 9999-01-01 d001
10003 43311 2001-12-01 9999-01-01 d002
select d.emp_no,s.salary,s.from_date,s.to_date,d.dept_no
from dept_manager d left join salaries s on d.emp_no=s.emp_no
order by s.emp_no

解答用紙のスコアが 80 を超える人のユーザー レベルの分布

説明

既存のユーザー情報テーブル user_info (uid ユーザー ID、nick_name ニックネーム、実績達成値、レベルレベル、職務経歴方向、register_time 登録時刻):

ID UID ニックネーム 成果 レベル 仕事 登録時間
1 1001 牛科1号 3100 7 アルゴリズム 2020-01-01 10:00:00
2 1002 牛ケ2号 2100 6 アルゴリズム 2020-01-01 10:00:00
3 1003 牛毛3号 1500 5 アルゴリズム 2020-01-01 10:00:00
4 1004 新受4号 1100 4 アルゴリズム 2020-01-01 10:00:00
5 1005 牛ケ5号 1600 6 C++ 2020-01-01 10:00:00
6 1006 牛毛6号 3000 6 C++ 2020-01-01 10:00:00

試験問題情報テーブル Exam_info (exam_id 試験問題 ID、タグ 試験問題カテゴリ、Difficulty 試験問題難易度、duration 試験期間、release_time リリース時間):

ID 試験ID 鬼ごっこ 困難 間隔 リリース時間
1 9001 SQL 難しい 60 2021-09-01 06:00:00
2 9002 C++ 簡単 60 2021-09-01 06:00:00
3 9003 アルゴリズム 中くらい 80 2021-09-01 10:00:00

試験解答情報テーブルexam_record(uidユーザーID、examid試験用紙ID、start_time解答開始時間、submit_time提出時間、得点スコア):

ID UID 試験ID 始まる時間 submit_time スコア
1 1001 9001 2021-09-01 09:01:01 2021-09-01 09:41:01 79
2 1002 9003 2021-09-01 12:01:01 2021-09-01 12:21:01 60
3 1002 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 70
4 1002 9001 2021-09-01 19:01:01 2021-09-01 19:40:01 80
5 1002 9003 2021-08-01 12:01:01 2021-08-01 12:21:01 60
6 1002 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 70
7 1002 9001 2021-09-01 19:01:01 2021-09-01 19:40:01 85
8 1002 9002 2021-09-01 12:01:01 (ヌル) (ヌル)
9 1003 9003 2021-09-07 10:01:01 2021-09-07 10:31:01 86
10 1003 9003 2021-09-08 12:01:01 2021-09-08 12:11:01 40
11 1003 9001 2021-09-01 13:01:01 2021-09-01 13:41:01 81
12 1003 9002 2021-09-01 14:01:01 (ヌル) (ヌル)
13 1003 9003 2021-09-08 15:01:01 (ヌル) (ヌル)
14 1005 9001 2021-09-01 12:01:01 2021-09-01 12:31:01 90
15 1005 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 88
16 1006 9002 2021-09-01 12:11:01 2021-09-01 12:31:01 89

统计作答SQL类别的试卷得分大于过80的人的用户等级分布,按数量降序排序(保证数量都不同)。示例数据结果输出如下:

level level_cnt
6 2
5 1

解释:9001为SQL类试卷,作答该试卷大于80分的人有1002、1003、1005共3人,6级两人,5级一人。

思路:

  • 按等级分组,计算每个等级的符合条件的人数。知识点:group by
  • 只挑选类别为SQL、且得分大于80的不同的用户进行统计人数,相同的用户只统计一次:
  • 按照人数的降序,相同情况下等级降序输出。order by level_cnt desc, level desc
select level,count(*) level_cnt
from user_info
where uid in(select uid 
            from exam_record er join examination_info ei on er.exam_id=ei.exam_id
            where score>80
            and tag='SQL')
group by level
order by level_cnt desc

试卷发布当天作答人数和平均分

请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序。

提示:请使用SELECT语句作答。

表结构:

drop table if exists examination_info,user_info,exam_record;
CREATE TABLE examination_info (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    exam_id int UNIQUE NOT NULL COMMENT '试卷ID',
    tag varchar(32) COMMENT '类别标签',
    difficulty varchar(8) COMMENT '难度',
    duration int NOT NULL COMMENT '时长',
    release_time datetime COMMENT '发布时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE user_info (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int UNIQUE NOT NULL COMMENT '用户ID',
    `nick_name` varchar(64) COMMENT '昵称',
    achievement int COMMENT '成就值',
    level int COMMENT '用户等级',
    job varchar(32) COMMENT '职业方向',
    register_time datetime COMMENT '注册时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE exam_record (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int NOT NULL COMMENT '用户ID',
    exam_id int NOT NULL COMMENT '试卷ID',
    start_time datetime NOT NULL COMMENT '开始时间',
    submit_time datetime COMMENT '提交时间',
    score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

表样例

user_info表:

id uid nick_name achievement level job register_time
1 1001 牛客1号 3100 7 算法 2020-01-01 10:00:00
2 1002 牛客2号 2100 6 算法 2020-01-01 10:00:00
3 1003 牛客3号 1500 5 算法 2020-01-01 10:00:00
4 1004 牛客4号 1100 4 算法 2020-01-01 10:00:00
5 1005 牛客5号 1600 6 C++ 2020-01-01 10:00:00
6 1006 牛客6号 3000 6 C++ 2020-01-01 10:00:00

输出样例:

exam_id uv avg_score
9001 3 81.3
select er.exam_id, count(distinct er.uid) uv,round(avg(er.score),1) avg_score
from examination_info ei,exam_record er
where ei.exam_id=er.exam_id
and ei.tag='SQL'
and date_format(ei.release_time,'%Y%m%d')=date_format(er.start_time,'%Y%m%d')
and er.uid in(select uid
             from user_info
             where level>5)
group by er.exam_id
order by uv desc,avg_score asc

 筛选限定昵称成就值活跃日期的用户

描述

现有用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间):

id uid nick_name achievement level job register_time
1 1001 牛客1号 1000 2 算法 2020-01-01 10:00:00
2 1002 牛客2号 1200 3 算法 2020-01-01 10:00:00
3 1003 进击的3号 2200 5 算法 2020-01-01 10:00:00
4 1004 牛客4号 2500 6 算法 2020-01-01 10:00:00
5 1005 牛客5号 3000 7 C++ 2020-01-01 10:00:00

试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

id uid exam_id start_time submit_time score
1 1001 9001 2020-01-02 09:01:01 2020-01-02 09:21:59 80
3 1001 9002 2021-02-02 19:01:01 2021-02-02 19:30:01 87
2 1001 9001 2021-05-02 10:01:01 (NULL) (NULL)
4 1001 9001 2021-06-02 19:01:01 2021-06-02 19:32:00 20
6 1001 9002 2021-09-01 12:01:01 (NULL) (NULL)
5 1001 9002 2021-09-05 19:01:01 2021-09-05 19:40:01 89
11 1002 9001 2020-01-01 12:01:01 2020-01-01 12:31:01 81
12 1002 9002 2020-02-01 12:01:01 2020-02-01 12:31:01 82
13 1002 9002 2020-02-02 12:11:01 2020-02-02 12:31:01 83
7 1002 9002 2021-05-05 18:01:01 2021-05-05 18:59:02 90
16 1002 9001 2021-09-06 12:01:01 2021-09-06 12:21:01 80
17 1002 9001 2021-09-06 12:01:01 (NULL) (NULL)
18 1002 9001 2021-09-07 12:01:01 (NULL) (NULL)
8 1003 9003 2021-02-06 12:01:01 (NULL) (NULL)
9 1003 9001 2021-09-07 10:01:01 2021-09-07 10:31:01 89
10 1004 9002 2021-08-06 12:01:01 (NULL) (NULL)
14 1005 9001 2021-02-01 11:01:01 2021-02-01 11:31:01 84
15 1006 9001 2021-02-01 11:01:01 2021-02-01 11:31:01 84

题目练习记录表practice_record(uid用户ID, question_id题目ID, submit_time提交时间, score得分):

id uid question_id submit_time score
1 1001 8001 2021-08-02 11:41:01 60
2 1002 8001 2021-09-02 19:30:01 50
3 1002 8001 2021-09-02 19:20:01 70
4 1002 8002 2021-09-02 19:38:01 70
5 1003 8002 2021-09-01 19:38:01 80

请找到昵称以『牛客』开头『号』结尾、成就值在1200~2500之间,且最近一次活跃(答题或作答试卷)在2021年9月的用户信息。

由示例数据结果输出如下:

uid nick_name achievement
1002 牛客2号 1200

解释:昵称以『牛客』开头『号』结尾且成就值在1200~2500之间的有1002、1004;

1002最近一次试卷区活跃为2021年9月,最近一次题目区活跃为2021年9月;1004最近一次试卷区活跃为2021年8月,题目区未活跃。

因此最终满足条件的只有1002。

 思路:
  • 在practice_record,exam_record中筛选出月份是2021年9月
    • where date_format(submit_time, '%Y%m') = '202109' 知识点:date_format
  • 筛选出成就值在1200到2500之间,uid在上述两个任意一个中,且nick_name能匹配牛客_号。where nick_name like '牛客_号' 知识点:like、
select uid,nick_name,achievement	
from user_info
where nick_name like '牛客_号'
and achievement between 1200 and 2500
and uid in (select uid
    from practice_record
    where date_format(submit_time, '%Y%m')='202109'
union all
     select uid
        from exam_record
        where date_format(submit_time, '%Y%m') = '202109')

おすすめ

転載: blog.csdn.net/qq_62799214/article/details/127846657