今天降温得好厉害,居然居然接近0度了,不禁让人想钻进被窝,打开投影仪看个电影~~这几天真的超想看电影,想重温高中看的傲慢与偏见和时空恋旅人。说到电影,前几天跟羊小羊一起看的利刃出鞘真的好精彩~!我好像也开始爱上悬疑推理了哈哈哈~不过还是胆子有点小,不太敢一个人看~~
结束碎碎念,一起来看看今天有什么题目吧~
闯关开始!
关卡1 - 平面上的最近距离
思路:
两个点 P1(x1, y1) 和 P2(x2, y2) 之间的欧几里得距离定义为 (x1−x2)^2 + (y1−y2)^2,所以为了求得距离,我们要利用内置函数 POW() 和 SQRT()。
怎么才能让x1 x2 y1 y2在一起呢,我们要把他们合并成一张表,
而合并的条件就是两个坐标不想等,(p1.x,p1.y) <> (p2.x,p2.y) 这样就可以啦~ 对了,<>这个符号的意思是不等于~
select round(min(sqrt(power(p1.x-p2.x,2)+power(p1.y-p2.y,2))),2)
as shortest
from point_2d p1
join point_2d p2
on (p1.x,p1.y) <> (p2.x,p2.y)
恭喜过关!进入下一关!
关卡2 - 直线上的最近距离
思路:
这道题跟前一道题一样的思路,还更简单了一点~
我们跟前面一样创建ab表,让a.x <> b.x
然后求ab之间绝对值的最小值,就是答案啦
select min(abs(b.x - a.x)) as shortest from point a
join point b
on a.x <> b.x
恭喜过关!进入下一关!
关卡3 - 二级关注者
思路:
经过观察,我发现产出表的follower(计算每个人有多少粉丝)其实是原来表格的followee(被关注的人),所以我们就select followee as follower。然后count他拥有的粉丝数量,group by followee。
记得要加上一个限制,限制 followee 要在follower中。
select followee as follower, count(distinct follower) as num from follow
where followee in (select distinct follower from follow)
group by followee
恭喜过关!进入下一关!
关卡4 - 平均工资:部门与公司比较
思路:
这道要对比部门平均工资和公司平均工资,那自然就是要算出部门平均和公司平均啦
所以我们在我们的子查询里面,我们做三件事情,1. 转换日期格式,用法:date_format(pay_date,'%Y-%m'), 2. 窗口函数算出部门平均,3.窗口函数算出公司平均。再强调一下,partition by可以理解成group by。
然后在主查询里面,我们要做的主要是case when,来分状况讨论,记得最后要group by pay month 和 department id。因为输出的表格里就是分部门分日期输出的。
select pay_month, department_id,
case when com_avg > dep_avg then 'lower'
when com_avg = dep_avg then 'same'
else 'higher' end as comparison
from(
select
date_format(pay_date,'%Y-%m') as pay_month,
department_id,
avg(amount) over(partition by pay_date) as com_avg,
avg(amount) over(partition by pay_date, department_id) as dep_avg
from
salary s join employee e on s.employee_id = e.employee_id)t
group by pay_month, department_id
order by pay_month desc, department_id
恭喜过关!进入下一关!
关卡5 - 学生地理信息报告
思路;
创建一些case when,当continent是America,则附上其对应的名字。(妙啊)
前面加max是为了排除null值,max和min都会忽略null值,所以这里用max,min都可以。
然后,以rk分组对该新列做max聚合分析。
select
max(case when continent = 'America' then name else null end) as America,
max(case when continent = 'Asia' then name else null end)as Asia,
max(case when continent = 'Europe' then name else null end) as Europe
from
(select *, row_number() over(partition by continent order by name) rk
from student) t
group by rk
来看看这道题分布的输出吧:
看完真的醍醐灌顶,太强了!!这是什么神仙逻辑,为什么可以有人这么聪明!!
你~学废了吗
恭喜过关!
今天学到的新知识:<>这个符号的意思是不等于;转换日期格式用法:date_format(列名,'%Y-%m');max和min这种聚合函数都会忽略null值。
明天继续闯关~yay ~