2023瑶池大赛

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 瑶池SQL大赛

赛题一:找出各项考试中的佼佼者

解题思路

1、分数去重

一个学生可以参加任意考试,不限次数。

若同一个考生有多条考试记录,则取最高分。

根据上述题意,在分数 testattempt 表中按照考试类型获取每个学生的最高分数,以此来保证每个学生在每门考试中只存在一个最高分。由此,我们得到第一个子表 t 。

selectMAX(`score`) asscore,
`studentId`,
`testId`from`testattempt`GROUPBY`studentId`,
`testId`


2、进行分类排序

找出每个考试中 得分最高的的考生 。

如果存在并列,将并列的考生都列举出来,直到列举的考生达到或超过三人。

  • 先对第一步表中的数据按照考试类型将分数从高到低排序,因此使用 order by t.testid,t.score desc
  • 根据同考试类型对分数进行排名,也就是相同的分数也排名相同。这里有两种方法,一种是我们可借助变量赋值的方式进行排名处理,另一种是借助于窗口函数 DENSE_RANK() 来处理。(代码参考后续截图代码)

3、根据排名取出前三

基于第二步的排名通过判断排名小于等于3来筛选出前三的学生,为方便显示,可再进行一次分数排序

方法一

SELECTtest.`name`astest,
student.`name`asstudent,
rankresult.scoreasscoreFROM  (
SELECTt.*,
-- 排名代码,如果考试 testid 与上一个不同,那么排名从1开始
@rank :=IF(
@prev_test=`testid`,
-- 如果分数 score 与上一个相同则沿用上次的排名,否则排名+1CASEWHEN@score=t.scoreTHEN@rankWHEN@score :=t.scoreTHEN@rank :=@rank+1END,
1      ) AS`rank`,
@score :=t.score,
@prev_test :=`testid`FROM      (
selectMAX(`score`) asscore,
`studentId`,
`testId`from`testattempt`GROUPBY`studentId`,
`testId`      ) astORDERBYt.`testid`,
t.`score`DESC  ) asrankresultJOIN`test`onrankresult.testid=test.`id`join`student`onrankresult.studentid=`student`.`id`whererankresult.rank<=3orderbyrankresult.testid,
rankresult.scoredesc


方法二

SELECTtest.`name`astest,
student.`name`asstudent,
rankresult.scoreasscoreFROM  (
SELECTt.*,
-- 此处使用 dense_rank() 进行不跳号排序
      (DENSE_RANK() over ( PARTITIONby`testId`ORDERBYt.scoreDESC )) ASmyrankFROM      (
selectMAX(`score`) asscore,
`studentId`,
`testId`from`testattempt`GROUPBY`studentId`,
`testId`      ) ast  ) asrankresultJOIN`test`onrankresult.testid=test.`id`join`student`onrankresult.studentid=`student`.`id`whererankresult.myrank<=3orderbyrankresult.testid,
rankresult.scoredesc


赛题二:游戏游玩情况

解题思路

1、计算总用户数

因用户可在不同日期登录,所以在数据表中存在多条记录因此需要按照 player_id 做去重后在计算用户数

SELECTCOUNT(DISTINCT (`player_id`)) asuser_countfrom`activity`


2、获取用户首次登录后7天的日期范围

按照用户 player_id 做分组,取最小的登录日期,使用 date_add 计算该日期7天内的日期,或者通过使用datediff结合变量赋值计算出距离第一次登陆时间时间差,从而得到中间表(方法一的 t2 ,方法二的 t1)。

PS:因为本题中给定的时间是日期格式,所以如果需求不算登录当天的话,date_add 的数值应该为 6。比如:5月24日的7天内的截止日期为 5月30日,而不是 5月31日。本题结果使用7做计算。

3、获取首次登录7天后登录的用户数量

使用 activity 表与步骤2中的 t2 做 join 查询,设置activity 表中的登录时间在 t2 的区间范围内,利用 group by player_id having count(1) >1,由此得到满足条件的用户。再对结果集进行 count 即可得到首次登录后7天后的登录用户数量

4、计算百分比并四舍五入保留两位小数

使用 round() 函数对步骤3中的数据除以步骤1中的数据,得到四舍五入的结果。

方法一

SELECTround(
COUNT(t3.player_id) / (
SELECTCOUNT(DISTINCT (`player_id`)) asuser_countfrom`activity`    ),
2  ) asfractionfrom  (
SELECTt1.`player_id`,
COUNT(1) asnumFROM`activity`t1join (
SELECTmin(event_date) asstart_date,
date_add(min(event_date), interval7day)asend_date,
`player_id`FROM`activity`GROUPBY`player_id`      ) t2ont1.`player_id`=t2.player_idwheret1.`event_date`BETWEENt2.start_dateandt2.end_dateGROUPBYt1.`player_id`HAVINGCOUNT(1) >1  ) t3


方法二

selectround(
t2.player_count/ (
SELECTCOUNT(DISTINCT (`player_id`)) asuser_countfrom`activity`    ),
2  ) asfractionfrom  (
SELECtcount(DISTINCT(`player_id`)) asplayer_countfrom      (
SELECT`player_id`,
`event_date`,
casewhen@player_id=`player_id`thendatediff(`event_date`, @prev_date)
when@player_id :=`player_id`then0endasdays,
casewhen@player_id1=`player_id`then@prev_datewhen@player_id1 :=`player_id`then@prev_date :=`event_date`endasfirst_login_dateFROM`activity`orderby`player_id`,
`event_date`asc      ) t1wheret1.days<=7andt1.days>0  ) t2


赛题三:计算三角形面积

解题思路

1、确认三角形计算面积公式

此处使用向量叉积的方式计算三角形面积。假设三个点坐标如下 (x1,y1,z1),(x2,y2,z2),(x3,y3,z3),那么该三角形组成的面积S的公式为:

2、获取三个点的具体坐标值

使用 join 方法分别将 triangle 表中三个点的具体坐标值,然后再使用公式计算即可。这里我们会需要用到求平方的函数 pow,以及求平方根的函数 sqrt。

结果

SELECTt.idasTriangleId,
round(
sqrt(
pow((y1-y2), 2) *pow((z1-z3), 2) +pow((z1-z2), 2) *pow((x1-x3), 2) +pow((x1-x2), 2) *pow((y1-y3), 2)
    ) *0.5,
2  ) asAreaFROM  (
SELECTt1.id,
t2.`x`asx1,
t2.`y`asy1,
t2.`z`asz1,
t3.`x`asx2,
t3.`y`asy2,
t3.`z`asz2,
t4.`x`asx3,
t4.`y`asy3,
t4.`z`asz3FROM`triangle`t1join`point`t2ont1.`pointId1`=t2.`id`join`point`t3ont1.`pointId2`=t3.`id`join`point`t4ont1.`pointId3`=t4.`id`  ) ast


相关文章
|
5月前
|
人工智能 运维 Cloud Native
云原生技术实践营 · 深圳站——Serverless + AI 专场邀您参会!
云原生技术实践营深圳站聚焦Serverless+AI,6月21日探索技术结合新思路,助力降低GPU成本,简化开发运维。限额80人,报名审核制,活动涵盖Serverless趋势、AIGC应用、AI算力优化等议题,还有实操体验与现场抽奖。
云原生技术实践营 · 深圳站——Serverless + AI 专场邀您参会!
|
6月前
|
关系型数据库 分布式数据库 数据库
精彩回顾 | 《国产数据库共话未来趋势》技术沙龙上海站成功举办!
2024年1月6日(周六),由阿里云 PolarDB开源社区发起,PostgreSQL中文社区、拓数派联合主办的“国产数据库共话未来趋势”技术沙龙在上海成功举行。
|
存储 人工智能 程序员
云栖大会天池专场:见证“数据洞察创新挑战赛”荣耀加冕
天池将于11月2日上午,与各位开发者相聚云栖大会·算力馆云栖SHOW场。
1032 0
云栖大会天池专场:见证“数据洞察创新挑战赛”荣耀加冕
|
云安全 人工智能 运维
2022云栖大会 | 袋鼠云斩获阿里云生态伙伴双奖
11月3日至5日,2022云栖大会在杭州云栖小镇成功举办
413 0
2022云栖大会 | 袋鼠云斩获阿里云生态伙伴双奖
|
人工智能 云计算
【免费报名 】欢迎线下参加2022阿里云生命科学与高性能计算峰会
八大跨领域知名专家主题演讲,把脉AI+生物医药的前沿趋势,产学研高端对话,多维思想碰撞,以及生命科学行业解决方案白皮书重磅发布。
【免费报名 】欢迎线下参加2022阿里云生命科学与高性能计算峰会
|
消息中间件 Cloud Native Dubbo
|
存储 Cloud Native 数据管理
免费报名|9月26日数聚云端 · 智驭未来「阿里云数据库创新上云峰会」邀你进入数智未来
2021年9月26日,“数聚云端·智驭未来”——阿里云数据库创新上云峰会暨第3届数据库性能挑战赛决赛颁奖典礼即将在京隆重召开。
16441 0
免费报名|9月26日数聚云端 · 智驭未来「阿里云数据库创新上云峰会」邀你进入数智未来
|
人工智能 大数据
云上创新 2021阿里云峰会邀您参加
云上创新 2021阿里云峰会邀您参加
925 0
云上创新 2021阿里云峰会邀您参加
|
大数据 BI 云栖大会
【赠票】2020云栖大会阿里云数据中台专场
收下这张观影券,9月18日13:00云上云栖见
5056 0
【赠票】2020云栖大会阿里云数据中台专场

热门文章

最新文章

  • 1
    2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
    17
  • 2
    2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
    11
  • 3
    2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
    6
  • 4
    2024Mysql And Redis基础与进阶操作系列(4-1)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
    5
  • 5
    2024Mysql And Redis基础与进阶操作系列(3-2)作者——LJS[含MySQL用户,权限,角色管理;举例说明详解步骤及常见报错问题对应的解决方法]
    6
  • 6
    2024Mysql And Redis基础与进阶操作系列(3-1)作者——LJS[含MySQL用户,权限,角色管理;举例说明详解步骤及常见报错问题对应的解决方法]
    7
  • 7
    2024Mysql And Redis基础与进阶操作系列(2)作者——LJS[含MySQL登录;DDL;DML;举例说明;编码等详解步骤及常见报错问题对应的解决方法]
    9
  • 8
    2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
    9
  • 9
    2024年护网行动全国各地面试题汇总(5)
    18
  • 10
    2024年护网行动全国各地面试题汇总(4)作者:————LJS
    22