大数据面试题之SQL题

1.有一个录取学生人数表,记录的是每年录取学生人数和入学学生的学制
以下是表结构:
CREATE TABLE admit (
id int(11) NOT NULL AUTO_INCREMENT,
year int(255) DEFAULT NULL COMMENT ‘入学年度’,
num int(255) DEFAULT NULL COMMENT ‘录取学生人数’,
stu_len varchar(255) DEFAULT NULL COMMENT ‘学生学制’,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT=‘录取人数’;
year表示学生入学年度
num表示对应年度录取学生人数
stu_len表示录取学生的学制
说明:例如录取年度2018学制3,表示该批学生在校年份为2018~2019、2019~2020、2020~2021
以下是示例数据:

id year num stu_len
1 2018 2000 3
2 2019 2000 3
3 2020 1000 4
4 2020 2000 3

根据以上示例计算出每年在校人数,写出SQL语句:

SELECT 
			t2.year,
			t2.res
FROM(
		SELECT 
			t1.`year`,
			SUM(t1.num) over(ORDER BY t1.`year`) as res,
			ROW_NUMBER() over(PARTITION BY t1.`year` ORDER BY t1.`year`) as ranking
		FROM(
				SELECT year,num FROM admit
				UNION ALL
				SELECT year+stu_len as year,-num FROM admit
				) as t1
		ORDER BY t1.`year`
		) as t2
WHERE t2.ranking = 1;

计算结果截图:
在这里插入图片描述

2.有一个分数表id 是该表的主键。该表的每一行都包含了一场考试的分数。Score 是一个有两位小数点的浮点值。
以下是表结构和数据:
Create table Scores (
id int(11) NOT NULL AUTO_INCREMENT,
score DECIMAL(3,2),
PRIMARY KEY (id)
);

查询并对分数进行排序。排名按以下规则计算:

分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是一个连续的整数。

分数表:

id score
1 3.5
2 3.65
3 4.0
4 3.85
5 4.00
6 3.65

根据以上示例数据计算出排名,写出SQL语句不能使用dense_rank和over开窗函数:

select s1.score,
    (
    		-- distinct 去除重复的成绩
        select count(distinct s2.score)
        from scores s2
        where s2.score >= s1.score 
    ) as 'rank'
from scores s1
order by s1.score desc;

计算结果截图:
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐