首页 > 数据库 >力扣618(MySQL)-学生地理信息报告(困难)

力扣618(MySQL)-学生地理信息报告(困难)

时间:2023-04-05 22:57:18浏览次数:45  
标签:case 地理信息 end name when 618 else 力扣 continent

题目:

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

该表没有主键。它可能包含重复的行。
该表的每一行表示学生的名字和他们来自的大陆。

一所学校有来自亚洲、欧洲和美洲的学生。

示例:

student:

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

 解题思路:

行转列---需要使用CASE...WHEN...

①行转列,会出现很多null值

1 select 
2    case when continent ='America' then name else null end as America,
3    case when continent ='Asia' then name else null end as Asia,
4    case when continent ='Europe' then name else null end as Europe
5 from student_618;

 ②使用max()或min()保留出姓名的最大值或最小值,但是每一列只能保存下一个值

1 select 
2    min(case when continent ='America' then name else null end) as America,
3    min(case when continent ='Asia' then name else null end) as Asia,
4    min(case when continent ='Europe' then name else null end) as Europe
5 from student_618;

③通过将studnet 表以continent分组name值进行排序;

1 select name ,continent, row_number() over(partition by continent order by name) as rnk
2 from student_618

最后再按序号进行分组聚合,就能得到每个序号的最小值了,这样所有值都能保留下来。

1 select 
2    min(case when continent ='America' then name else null end) as America,
3      min(case when continent ='Asia' then name else null end) as Asia,
4      min(case when continent ='Europe' then name else null end) as Europe
5 from (
6 select name ,continent, row_number() over(partition by continent order by name) as rnk
7 from student_618
8 ) as temp
9 group by rnk;

 小知识:

①rank() over():相同的序号一样,下一个不同数跳跃序数,例如:1,2,2,4

dense_rank() over():相同的序号一样,下一个不同数连续序数,例如:1,2,2,3

row_number() over():无论相同与否,按顺序排序,例如:1,2,3,4

②case...when...语法:

-- 语法一
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end
-- 语法二
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end

标签:case,地理信息,end,name,when,618,else,力扣,continent
From: https://www.cnblogs.com/liu-myu/p/17291216.html

相关文章

  • 力扣题目整数除法
    在力扣上做题,这个题涉及到的整数溢出问题十分恼人,主要也是我不熟悉这些东西,做的很艰难,下面是题目:给定两个整数a和b,求它们的除法的商a/b,要求不得使用乘号'*'、除号'/'以及求余符号'%'。注意:整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345)=8以及......
  • 力扣2-两数之和
    namespaceTest2;//Definitionforsingly-linkedlist.publicclassListNode{publicintval;publicListNodenext;publicListNode(intval=0,ListNodenext=null){this.val=val;this.next=next;}......
  • 力扣615(MySQL)-平均工资:部门与公司比较(困难)
    题目:给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果(高/低/相同)。表:salary employee_id字段是表employee中employee_id字段的外键。 对于如上样例数据,结果为:解释在三月,公司的平均工资是(9000+6000+10000)/......
  • 力扣614(MySQL)-二级关注者(中等)
    题目:在facebook中,表follow会有2个字段:followee,follower,分别表示被关注者和关注者。请写一个sql查询语句,对每一个关注者,查询关注他的关注者的数目。比方说: 应该输出: 解释:B和D都在在follower字段中出现,作为被关注者,B被C和D关注,D被E关注。A不在......
  • 力扣-数组-滑动窗口
    题目顺序209长度最小的子数组,904水果成篮解题思路1.滑动窗口求解的题目中,关键词为”求解连续“2.暴力解法是双重for循环,相当于对滑动窗口的起始和终止点都遍历3.滑动窗口求解是,只遍历终止点,当sum符合条件时,start++,向前一步缩小窗口4.终止条件是终止点end遍历完  1c......
  • 力扣---剑指 Offer 41. 数据流中的中位数
    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是3[2,3]的中位数是(2+3)/2=2.5设计一个支持以下......
  • 力扣26-2023.4.3
    力扣26-2023.4.3问题26.删除有序数组中的重复项方法思路:遍历数组,若后一个和前一个相同,则继续下一个;若后一个与前一个不同,则直接赋值。C++程序:#include<iostream>#include<vector>usingnamespacestd;intremoveDuplicates(vector<int>&nums){/*......
  • 力扣---面试题 02.01. 移除重复节点
    编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1,2,3,3,2,1]输出:[1,2,3]示例2:输入:[1,1,1,1,2]输出:[1,2]提示:链表长度在[0,20000]范围内。链表元素在[0,20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决?来源:力扣(LeetC......
  • 力扣612(MySQL)-平面上的最近距离(中等)
    题目:表point_2d保存了所有点(多于2个点)的坐标(x,y),这些点在平面上两两不重合。写一个查询语句找到两点之间的最近距离,保留2位小数。 最近距离在点(-1,-1)和(-1,2)之间,距离为1.00。所以输出应该为: 解题思路:建表语句:1createtableifnotexistspoint_2d(x......
  • 力扣---剑指 Offer 36. 二叉搜索树与双向链表
    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例:   我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对......