首页 > 数据库 >轻松应对面试手撕SQL之TopN问题,数开面试必考系列二(社招校招均适用)

轻松应对面试手撕SQL之TopN问题,数开面试必考系列二(社招校招均适用)

时间:2024-01-08 15:05:51浏览次数:31  
标签:社招校 school TopN rank 面试 score 分组 year row


社会主义打工人即将结束周末(加班一天)的愉快生活,只能说一个字:爽!实在没继续工作的状态,来给大家总结一道面试中大热门的面试题,可以说是top1的:TOPN问题。

轻松应对面试手撕SQL之TopN问题,数开面试必考系列二(社招校招均适用)_窗口函数

工作中也会经常遇到这样的业务问题:如何找到每个产品种类下用户最喜欢的产品是哪个?如果找到每个商品下用户点击最多的5个商品是什么?这类问题其实就是常见的:分组取每组最大值、最小值,每组最大的N条(top N)记录。面对该类问题,如何解决呢?

举例:根据下面示例数据选出, 今年每个学校,每个年级,每个科目前三的学生姓名和他的成绩。

【解题思路】

1.看到问题中要查“每个”学生最高的成绩。还记得我们之前课程里讲过的吗?当有“每个”出现的时候,就要想到是要分组了。

这里是“每个学校,每个年级,每个科目”,结合表的结构,是按学生“学校、年级、科目”来分组。

2.将表按学生姓名分组后,把成绩按降序排列,排在最前面的3个就是我们要找的“成绩最高的3个学生”。

3.现在分组后,需要排序,又不减少原表的行数,这种功能自然想到是窗口函数。

4.使用哪个专用窗口函数?为了不受并列成绩的影响,使用row_number专用窗口函数:row_number函数:也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。

【解题步骤】

步骤一:按姓名分组(partiotion by 姓名)、并按成绩降序排列(order by 成绩 desc),套入窗口函数的语法,就是下面的sql语句:

SELECT
  year,
  school,
  class,
  subject,
  name,
  score,
  row_number() OVER (
    PARTITION BY year,
    school,
    class,
    subject
    ORDER BY
      score DESC
  ) AS rank
FROM
  topn_scores
WHERE
  year = 2023

步骤二:筛选出前3高的成绩,所以我们在上一步基础上加入一个where字句来筛选出符合条件的数据。(where 排名 <=3)。

SELECT
  year,
  school,
  class,
  subject,
  name,
  score
FROM
  (
    SELECT
      year,
      school,
      class,
      subject,
      name,
      score,
      row_number() OVER (
        PARTITION BY year,
        school,
        class,
        subject
        ORDER BY
          score DESC
      ) AS rank
    FROM
      topn_scores
    WHERE
      year = 2023 
  ) subquery
WHERE
  rank <= 3;

【问题总结】

1)考察如何使用窗口函数及专用窗口函数排名的区别:rank, dense_rank, row_number

2)经典topN问题:每组最大的N条记录。这类问题涉及到“既要分组,又要排序”的情况,要能想到用窗口函数来实现。

 TopN问题 sql模板

select
  *
from
  (
    select
      *,
      row_number() over (
        partition by 要 分 组 的 列 名
        order by
          要 排 序 的 列 名 desc
      ) as rank
    from
      表 名
  ) as a
where
  rank <= N;

类似的问题还有很多,我们都可以用上面的模板来处理。很重要哈。

标签:社招校,school,TopN,rank,面试,score,分组,year,row
From: https://blog.51cto.com/u_15346267/9144944

相关文章

  • 面试官:眉毛胡子一把抓,这就是你设计的项目结构
    Java经典项目目录结构大家好,我是JavaPub。很多刚工作的同学进入公司,拿到前辈们写的高级代码,眼前一亮希望可以从里边得到成长。今天和大家聊一聊Java项目目录结构。因为一些原因,我们在学校里学到的知识会滞后一些。但是好在万变不离其宗。接下来这个项目结构可以覆盖绝大多数项......
  • Kafka消息阻塞:拯救面试的八大终极解决方案!
    大家好,我是小米,一个对技术充满热情的90后程序员。最近在准备社招面试的过程中,遇到了一个超级有挑战性的问题:“Kafka消息阻塞怎么解决?”今天,我就来和大家一起深入剖析这个问题,分享我在解决过程中的心得和经验。认识Kafka消息阻塞首先,我们得了解一下Kafka消息阻塞是什么?简单来说,Kafka......
  • #yyds干货盘点# LeetCode程序员面试金典:找不同
    题目给定两个字符串s和t,它们只包含小写字母。字符串t由字符串s随机重排,然后在随机位置添加一个字母。请找出在t中被添加的字母。 示例1:输入:s="abcd",t="abcde"输出:"e"解释:'e'是那个被添加的字母。示例2:输入:s="",t="y"输出:"y"代码实现classSo......
  • #yyds干货盘点# LeetCode程序员面试金典:复数乘法
    题目复数可以用字符串表示,遵循"实部+虚部i"的形式,并满足下述条件:实部是一个整数,取值范围是[-100,100]虚部也是一个整数,取值范围是[-100,100]i2==-1给你两个字符串表示的复数num1和num2,请你遵循复数表示形式,返回表示它们乘积的字符串。 示例1:输入:num1="1......
  • 30道python自动化测试面试题与答案汇总
    对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下1、什么项目适合做自动化测试?关键字:不变的、重复的、规范的1)任务测试明确,需求不会频繁......
  • 程序员的25大Tomcat面试问题及答案
    文章目录1.Tomcat的缺省端口是多少,怎么修改?2.tomcat有哪几种Connector运行模式(优化)?3.Tomcat有几种部署方式?4.tomcat容器是如何创建servlet类实例?用到了什么原理?5.tomcat如何优化?6.内存调优7.垃圾回收策略调优8.添加JMS远程监控9.专业点的分析工具有10.关于Tomcat的session数......
  • 程序员的50大Spring面试问题及答案
    文章目录1.Spring框架?2.Spring的整体架构?3.Spring可以做什么?4.Spring的优点?缺点?5.你能说几个Spring5的新特性吗?6.IOC?7.什么是依赖注入?8.IOC注入哪几种方式?9.IOC优点?缺点?10.bean的生命周期?11.Spring有几种配置方式?12.Spring中的bean有几种scope?13.什么是AOP(面向切面编程)?14.......
  • 程序员的30大SpringBoot面试问题及答案
    文章目录1.什么是SpringBoot?2.SpringBoot的特征?3.如何快速构建一个SpringBoot项目?4.SpringBoot启动类注解?它是由哪些注解组成?5.什么是yaml?6.SpringBoot支持配置文件的格式?7.SpringBoot启动方式?8.SpringBoot需要独立的容器运行?9.SpringBoot配置途径?10.application.properties和......
  • 程序员的20大Servlet面试问题及答案
    文章目录1.Servlet生命周期2.什么是jsp?jsp和Servlet有什么区别?3.Servlet接口中有哪些方法?4.Servlet3.0中的异步处理指的是什么?5.Servlet中如何获取用户提交的查询参数或表单数据?6.区别请求的转发与重定向?7.比较一下Servlet与Filter8.我们在web应用开发过程中经常遇到输出某......
  • 程序员的38大Redis面试问题及答案-下
    文章目录1.查看配置语法2.获取所有配置项3.设置字符串4.获取字符串5.获取随机key6.获取key存储的类型7.判断key是否存在8.修改key的名称9.返回key存储的字符串的长度10.同时设置多个kv对11.获取多个key的值12.设置key10秒后过期13.查看当前还剩几秒过期14.过期后获取key15.列表最......