暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

阿里云瑶池数据库SQL挑战赛来袭,开启答题

原创 i查拉图斯特拉如是说 2023-06-14
619

首先第一步肯定是创建数据库导入数据文件啦!基本没有难度吧~


问题1

编写一个SQL查询,找出每个考试中 得分最高的的考生 。

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

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

以 每门考试考试分数从高到低的顺序 返回结果表。

解题思路

思路:首先SELECT *
FROM `testattempt`
WHERE (`testId`,`score`) IN (SELECT testId, MAX(`score`) FROM testattempt GROUP BY `testId` )
order by `testId` , `score` desc
执行上面的sql找出每门课程最高的成绩,然后子查询一下,获取所有的考试分数最高的学生,但是这里还会有很多并列的分数接着使用一个分区排名函数进行排序,有了序号,就容易了,只要前三筛选一下就好了。

Sql:

with t_rowtable
as
(
    
SELECT testId, `studentId` , `score` ,
row_number() OVER (
    PARTITION BY `testId` # 声明按照课程分区
    ORDER BY `score` DESC # 声明分区按照score降序排序,
) 'num'

FROM `testattempt`
WHERE (`testId`,`score`) IN (SELECT testId, MAX(`score`) FROM testattempt GROUP BY `testId` )
)
select c.name, s.`name`, t.score from t_rowtable as t inner join `student` as s on s.id = t.studentId INNER JOIN `test` as c on c.id = t.testId where num <= 3

执行结果:



问题2

首先导入数据

编写一个 SQL 查询,报告在首次游玩后的一周内至少再有一次游玩的玩家的比例,也就是注册首周内至少有两次登录的玩家占总玩家的比例,四舍五入到小数点后两位。

解题思路:

首先需要判断的是当前时间与上一次的间隔时间,只要是间隔在7天之内的就是我们想要的数据,然后这里有个问题就是可能不是第一次登陆而是之后登陆的,所以还要区分一下,所以需要排序一下,只要判断是一开始登陆的取前两次的就算我们理想的数据可以用LAG( , 1 ) OVER (PARTITION BY ORDER BY )DATEDIFF()求出相邻两次登录的时间间隔,row_number()函数来进行排序。

Sql语法:

WITH
  tmp_table AS (
    SELECT
      player_id,
      DATEDIFF(
        event_date,
        LAG(event_date, 1) OVER (
          PARTITION BY
            player_id
          ORDER BY
            event_date
        )
      ) day,
      ROW_NUMBER() OVER (
        PARTITION BY
          player_id
        ORDER BY
          event_date
      ) num
    FROM
      activity
  )SELECT
  ROUND(
    count( DISTINCT( `player_id`) ) / (
      select
          count( DISTINCT( `player_id`) )
        FROM
          activity
    ),
    2
  ) fraction
FROM
  tmp_table
WHERE
  day <=7  and num <= 2;

执行结果:


问题3

写一个SQL查询,计算每个三角形的面积,保留两位小数。

解题思路:

公式:


因此,您可以使用上述公式,分别计算出三条边的长度。

    然后再根据海伦公式就可以计算出面积了


sql语法

WITH
  ta AS (
    SELECT
      t.id,
      SQRT(POW(p1.x - p3.x, 2) + POW(p1.y - p3.y, 2) + POW(p1.z - p3.z, 2)) as CA,
      SQRT(POW(p3.x - p2.x, 2) + POW(p3.y - p2.y, 2) + POW(p3.z - p2.z, 2)) as BC,
      SQRT(POW(p2.x - p1.x, 2) + POW(p2.y - p1.y, 2) + POW(p2.z - p1.z, 2)) as AB,
      (
        SQRT(POW(p1.x - p3.x, 2) + POW(p1.y - p3.y, 2) + POW(p1.z - p3.z, 2))+
        SQRT(POW(p3.x - p2.x, 2) + POW(p3.y - p2.y, 2) + POW(p3.z - p2.z, 2)) +
        SQRT(POW(p2.x - p1.x, 2) + POW(p2.y - p1.y, 2) + POW(p2.z - p1.z, 2))
      ) / 2 p
    FROM
      triangle t
      LEFT JOIN point p1 on t.pointId1 = p1.id
      LEFT JOIN point p2 on t.pointId2 = p2.id
      LEFT JOIN point p3 on t.pointId3 = p3.id
  )
SELECT
  id, Round(SQRT((p * (p - CA) * (p - BC) * (p - AB))), 2) area
FROM
  

执行结果:



总结

题目很刁钻,一般的分组还解决不了,只能用分区和函数加以控制,确实有点挑战性,还有需要用到一些公式表达。需要自行谷歌查找公式,有一定的知识盲区,不过最后还是解决问题了,欧耶!

另外吐槽一下阿里数据库控制台,感觉有时候有些关键字报错他只会提示你语法错误不会提示你关键字的情况,比navicat差那么一丢丢,不过网页控制台还是可以了。希望之后可以优化一下,错误提示信息,找了好久对比下才发现有些表或者关键字不加单引用,会报错,例如分组如果不加单引号真看不出哪里语法有问题。

最后修改时间:2023-06-14 20:04:20
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论