Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode面试SQL-学生地理信息报告

LeetCode面试SQL-学生地理信息报告

作者头像
数据仓库晨曦
发布于 2024-09-24 10:45:35
发布于 2024-09-24 10:45:35
9700
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

一、题目

一所美国大学有来自亚洲、欧洲和美洲的学生,他们的地理信息存放在如下 student 表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+------------+
|  name   | continent  |
+---------+------------+
| Jack    | America    |
| Pascal  | Europe     |
| Xi      | Asia       |
| Jane    | America    |
+---------+------------+

写一个查询语句实现对大洲(continent)列的透视表操作,使得每个学生按照姓名的字母顺序依次排列在对应的大洲下面。输出的标题应依次为美洲(America)、亚洲(Asia)和欧洲(Europe)。数据保证来自美洲的学生不少于来自亚洲或者欧洲的学生。

对于样例输入,它的对应输出是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----------+-------+---------+
| America  | Asia  | Europe  |
+----------+-------+---------+
| Jack     | Xi    | Pascal  |
| Jane     | NULL  | NULL    |
+----------+-------+---------+

**进阶:**如果不能确定哪个大洲的学生数最多,你可以写出一个查询去生成上述学生报告吗?

二、分析

本题属于行转列的题目,但是本题有意思的点在于没有行id,也不关注顺序。因为没有id所以没有办法关联,这也是这个题目中的难点

维度

评分

题目难度

⭐️⭐️⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐️

业务常见度

⭐️⭐️⭐️

三、SQL

1.常规解法-开窗函数

使用row_number开窗,给出每个大洲不同学生一个id,每个大洲从1开始计数,这个id也是行id。根据该id分组可以计算出所有的行。对于进阶问题 则可以顺利解决。人数最多的大洲id最大。按照rn分组,进行行转列,但不查询rn即可得到最终结果 执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select max(if(continent = 'America', name, null)) America,
       max(if(continent = 'Asia', name, null))    Asia,
       max(if(continent = 'Europe', name, null))  Europe
from (select *, row_number() over (partition by continent order by name) rn
      from t1_student) t
group by rn

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----------+-------+---------+
| America  | Asia  | Europe  |
+----------+-------+---------+
| Jack     | Xi    | Pascal  |
| Jane     | NULL  | NULL    |
+----------+-------+---------+

2.pivot解法

与上面类似,需要使用row_number开窗得到行id,但是行转列的时候使用透视表pivot的方式,不是if或者case when的方式。

这里pivot中非判断条件、非聚合的列即group by的列。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select America,Asia,Europe
from (select *, row_number() over (partition by continent order by name) rn
      from t1_student) t pivot(
max(name) for continent in('America' as America,'Asia' as Asia,'Europe' as Europe)
)

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----------+-------+---------+
| America  | Asia  | Europe  |
+----------+-------+---------+
| Jack     | Xi    | Pascal  |
| Jane     | NULL  | NULL    |
+----------+-------+---------+

四、建表语句和数据插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--建表语句
CREATE TABLE t1_student(
name string,
continent string
) COMMENT '学生信息表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
-- 插入数据
insert into t1_student(name,continent)
values
('Jack','America'),
('Pascal','Europe'),
('Xi','Asia'),
('Jane','America');
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「SQL面试题库」 No_42 学生地理信息报告
「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。
不吃西红柿
2023/04/21
2390
LeetCode MySQL 618. 学生地理信息报告(row_number)
一所美国大学有来自亚洲、欧洲和美洲的学生,他们的地理信息存放在如下 student 表中。
Michael阿明
2021/02/19
4850
​LeetCode刷题实战618:学生地理信息报告
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/06/07
2230
​LeetCode刷题实战618:学生地理信息报告
Leetcode 618. 学生地理信息报告(分组行转列)
select min(case when continent='America' then name end) America, min(case when continent='Asia' then name end)Asia, min(case when continent='Europe' then name end)Europe from( select *,row_number() over(partition by continent order
glm233
2021/05/06
3670
蓝桥楼赛第23期-新冠疫情数据统计
2020 年,新冠疫情肆掠全球。约翰·霍普金斯大学 跟踪了全球病例数据,包括总病例数、COVID-19 传播速度以及全球爆发情况。我们拿到了截止于某日的疫情数据,希望通过 Python 统计出我们需要的疫情指标。
Spaceack
2020/11/04
5030
蓝桥楼赛第23期-新冠疫情数据统计
SQL 行转列+窗口函数的实例
今天继续和大家分享 HackerRank 上的 SQL 编程挑战的解题思路,这一次的题目叫做“Occupations”,属于中等难度级别,答案提交的成功率在 90% 左右。
白日梦想家
2020/08/02
2.1K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
行列转换包括以下六种情况:(1)列转行。(2)行转列。(3)多列转换成字符串。(4)多行转换成字符串。(5)字符串转换成多列。(6)字符串转换成多行。其中,重点是行转列和字符串转换成多行。
AiDBA宝典
2019/09/29
1.8K0
【DB笔试面试467】Oracle中行列互换有哪些方法?
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
有学生成绩表,包含学生姓名、学科、成绩三个字段,请用一条SQL查询出每个学科排名第三名的学生,他的学科成绩、总成绩、以及总排名。
数据仓库晨曦
2024/07/12
2550
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
LeetCode数据库题目集合
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
MiChong
2021/02/24
9700
LeetCode数据库题目集合
LeetCode面试SQL-获取最近第二次活动
该表不包含主键 该表包含每个用户在一段时间内进行的活动的信息 名为 username 的用户在 startDate 到 endDate 日内有一次活动
数据仓库晨曦
2024/10/09
1220
LeetCode面试SQL-获取最近第二次活动
oracle的行转列和列转行_sql中行转列
--============================================== 作者:王运亮(wwwwgou) 时间:2011-06-10 博客:http://blog.csdn.net/wwwwgou --==============================================
Java架构师必看
2022/05/26
4.1K0
大数据面试SQL-奖金瓜分问题
在活动大促中,有玩游戏瓜分奖金环节。现有奖金池为 10000元,代表奖金池中的初始额度。用户的分数信息如下表。表中的数据代表每一个用户和其对应的得分,user_id 和 score 都不会有重复值。瓜分奖金的规则如下:按照 score 从高到低依次瓜分,每个人都能分走当前奖金池里面剩余奖金的一半,当奖金池里面剩余的奖金少于 250 时(不含),则停止瓜分奖金。现在需要查询出所有分到奖金的 user_id 和其对应的奖金。
数据仓库晨曦
2024/08/01
1220
大数据面试SQL-奖金瓜分问题
这5个超级经典SQL都不会,回去等通知吧
可以用反向思维,先查询出表里面有小于 80 分的 name,然后用 not in 去除掉
不吃西红柿
2022/09/19
3130
这5个超级经典SQL都不会,回去等通知吧
常见大数据面试SQL-奖金瓜分问题
在活动大促中,有玩游戏瓜分奖金环节。现有奖金池为 10000元,代表奖金池中的初始额度。用户的分数信息如下表。表中的数据代表每一个用户和其对应的得分,user_id 和 score 都不会有重复值。瓜分奖金的规则如下:按照 score 从高到低依次瓜分,每个人都能分走当前奖金池里面剩余奖金的一半,当奖金池里面剩余的奖金少于 250 时(不含),则停止瓜分奖金。现在需要查询出所有分到奖金的 user_id 和其对应的奖金。
数据仓库晨曦
2024/07/26
1230
常见大数据面试SQL-奖金瓜分问题
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
背景:要迁移数据库,需要创建与源库相同的表空间,大小与源库相同。由于个别表空间较大,手工添加可能需要写很多的脚本,于是同事通过PL/SQL解决了问题。
数据和云
2021/10/13
1.2K0
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
那些年我们写过的T-SQL(中篇)
中篇的重点在于,在复杂情况下使用表表达式的查询,尤其是公用表表达式(CTE),也就是非常方便的WITH AS XXX的应用,在SQL代码,这种方式至少可以提高一倍的工作效率。此外开窗函数ROW_NUMBER的使用也使得数据库分页变得异常的容易,其他的一些特性使用相对较少,在需要时再查阅即可。 本系列包含上中下三篇,内容比较驳杂,望大家耐心阅读: 那些年我们写过的T-SQL(上篇):上篇介绍查询的基础,包括基本查询的逻辑顺序、联接和子查询 那些年我们写过的T-SQL(中篇):中篇介绍表表达式、集合运算符和开窗
用户1216676
2018/01/24
3.9K0
那些年我们写过的T-SQL(中篇)
滴滴大数据面试SQL-取出累计值与1000差值最小的记录
已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。
数据仓库晨曦
2024/05/18
1940
滴滴大数据面试SQL-取出累计值与1000差值最小的记录
小红书大数据面试SQL-查询每个用户的第一条和最后一条记录
现有一张订单表 t_order 有订单ID、用户ID、商品ID、购买商品数量、购买时间,请查询出每个用户的第一条记录和最后一条记录。样例数据如下:
数据仓库晨曦
2024/06/27
2780
小红书大数据面试SQL-查询每个用户的第一条和最后一条记录
常见大数据面试SQL-查询前2大和前2小用户并有序拼接
有用户账户表,包含年份,用户id和值,请按照年份分组,取出值前两小和前两大对应的用户id,需要保持值最小和最大的用户id排首位。
数据仓库晨曦
2024/07/12
1360
常见大数据面试SQL-查询前2大和前2小用户并有序拼接
LeetCode面试SQL-给定数字的频率查询中位数
在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。
数据仓库晨曦
2024/10/14
1250
LeetCode面试SQL-给定数字的频率查询中位数
推荐阅读
相关推荐
「SQL面试题库」 No_42 学生地理信息报告
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验