当前位置: 首页 > news >正文

SQL开窗函数相关的面试题和答案

基本排序与分组问题

  • 题目:有学生成绩表tb_score,包含字段SNO(学号)、SCLASS(班级)、CHINESE(语文成绩)、ENGLISH(英语成绩)、ARITH(数学成绩)。要求查询每个班级内,按照语文成绩降序、英语成绩升序、数学成绩降序排序,展示每个学生的信息及在班级内的排名。
  • 示例代码:
  
SELECT sno, sclass, chinese, english, arith,RANK() OVER(PARTITION BY sclass ORDER BY chinese DESC) rn1_chinese,RANK() OVER(PARTITION BY sclass ORDER BY english ASC) rn2_english,RANK() OVER(PARTITION BY sclass ORDER BY arith DESC) rn3_arith
FROM tb_score;

TopN问题

  • 题目:有一张“学生成绩表”,包含4个字段:班级id、学生id、课程id、成绩。查询每个班级中成绩排名前三的学生信息。
  • 示例代码:
  
SELECT *
FROM (SELECT *,DENSE_RANK() OVER(PARTITION BY 班级id ORDER BY 成绩 DESC) AS 顺序FROM 学生成绩表
) t1
WHERE 顺序 <= 3;

聚合计算问题

  • 题目:有用户存款表tb_user,包含字段name(姓名)、month(月份)、amt(存款金额)。计算每个用户的累计存款金额以及在每个月的存款金额占该用户总存款金额的比例。
  • 示例代码:
  
SELECT s.*,SUM(s.amt) OVER(PARTITION BY s.name ORDER BY s.month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 累计存款金额,ROUND(s.amt / SUM(s.amt) OVER(PARTITION BY s.name), 2) AS 占比
FROM tb_user s;

数据偏移与连续判断问题

  • 题目:有用户登陆表user_login_table,包含字段user_name(用户名)、date(登陆时间)。找出连续5天都登陆平台的用户。
  • 示例代码:
  
SELECT b.user_name
FROM (SELECT user_name,date,LEAD(date, 5) OVER(PARTITION BY user_name ORDER BY date DESC) AS date_5FROM user_login_table
) b
WHERE b.date IS NOT NULLAND DATE_SUB(CAST(b.date AS DATE), INTERVAL 5 DAY) = CAST(b.date_5 AS DATE);

分组统计与对比问题

  • 题目:有员工信息表,包含字段员工ID、部门ID、薪资。找出每个部门中薪资高于该部门平均薪资的员工信息。
  • 示例代码:
  
SELECT *
FROM (SELECT *,AVG(薪资) OVER(PARTITION BY 部门ID) AS 部门平均薪资FROM 员工信息表
) t
WHERE 薪资 > 部门平均薪资;

数据分布与排名问题

  • 题目:有商品销售表sales,含字段product_id(商品ID)、category(商品类别)、sales_amount(销售金额)。查询每个商品类别中,销售金额处于前20%的商品信息。
  • 思路:用NTILE函数将每个类别内的商品按销售金额排名分桶,选出位于第一桶(前20%)的商品。
SELECT product_id, category, sales_amount
FROM (SELECT product_id, category, sales_amount,NTILE(5) OVER(PARTITION BY category ORDER BY sales_amount DESC) AS percentileFROM sales
) AS subquery
WHERE percentile = 1;

移动平均与趋势分析问题

  • 题目:有股票交易表stock_trades,含字段trade_date(交易日期)、stock_symbol(股票代码)、closing_price(收盘价)。计算每只股票近5个交易日的移动平均收盘价。
  • 思路:用AVG函数结合开窗,对每只股票按交易日期排序,计算当前行及前4行的收盘价平均值。
SELECT trade_date, stock_symbol, closing_price,AVG(closing_price) OVER(PARTITION BY stock_symbol ORDER BY trade_dateROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS moving_avg_5day
FROM stock_trades;

分组累计与占比问题

  • 题目:有订单表orders,含字段order_date(订单日期)、customer_id(客户ID)、order_amount(订单金额)。查询每个客户每月的累计订单金额及该月订单金额占当年总订单金额的比例。
  • 思路:先按客户和订单日期分区,用SUM函数计算累计订单金额,再用每月订单金额除以当年总订单金额得出占比。
SELECT customer_id, order_date, order_amount,SUM(order_amount) OVER(PARTITION BY customer_id, YEAR(order_date)ORDER BY order_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS monthly_cumulative_amount,order_amount / SUM(order_amount) OVER(PARTITION BY customer_id, YEAR(order_date)) AS monthly_percentage
FROM orders;

数据筛选与条件判断问题

  • 题目:有学生考试成绩表exam_scores,含字段student_id(学生ID)、exam_date(考试日期)、subject(科目)、score(成绩)。找出每个学生至少连续3次考试成绩都在80分以上的科目。
  • 思路:用LAG或LEAD函数获取前后行成绩,结合窗口函数判断是否连续3次成绩大于80分,再筛选出满足条件的科目。
SELECT student_id, subject
FROM (SELECT student_id, subject,-- 标记连续三次成绩大于80分CASEWHEN score > 80 ANDLAG(score, 1) OVER(PARTITION BY student_id, subject ORDER BY exam_date) > 80 ANDLAG(score, 2) OVER(PARTITION BY student_id, subject ORDER BY exam_date) > 80THEN 1ELSE 0END AS consecutive_80_plusFROM exam_scores
) AS subquery
WHERE consecutive_80_plus = 1
GROUP BY student_id, subject;

行列转换与统计问题

  • 题目:有销售记录表sales_records,含字段product_name(产品名称)、month(月份)、sales_volume(销量)。将每个月的销量数据转换为列,即每行是一个产品,每列是对应月份的销量,并计算每个产品的全年总销量。
  • 思路:用CASE语句结合开窗函数,按产品名称分区,将不同月份的销量值分配到对应的列,再用SUM函数计算全年总销量。
SELECT product_name,-- 为每个月创建一列,统计销量MAX(CASE WHEN month = '一月' THEN sales_volume END) AS 一月销量,MAX(CASE WHEN month = '二月' THEN sales_volume END) AS 二月销量,-- 以此类推...SUM(sales_volume) AS 全年总销量
FROM sales_records
GROUP BY product_name;

在不同的数据库中, PIVOT 函数的语法略有不同,以下以常见的关系型数据库(如SQL Server)为例来解决这个问题:

-- 使用PIVOT函数
SELECT product_name,-- 1月销量ISNULL([1], 0) AS "January",ISNULL([2], 0) AS "February",ISNULL([3], 0) AS "March",ISNULL([4], 0) AS "April",ISNULL([5], 0) AS "May",ISNULL([6], 0) AS "June",ISNULL([7], 0) AS "July",ISNULL([8], 0) AS "August",ISNULL([9], 0) AS "September",ISNULL([10], 0) AS "October",ISNULL([11], 0) AS "November",ISNULL([12], 0) AS "December",-- 计算全年总销量ISNULL([1], 0) + ISNULL([2], 0) + ISNULL([3], 0) + ISNULL([4], 0) + ISNULL([5], 0) + ISNULL([6], 0) + ISNULL([7], 0) + ISNULL([8], 0) + ISNULL([9], 0) + ISNULL([10], 0) + ISNULL([11], 0) + ISNULL([12], 0) AS total_sales_volume
FROM 
(SELECT product_name, month, sales_volumeFROM sales_records
) AS SourceTable
PIVOT
(SUM(sales_volume)FOR month IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) AS PivotTable;

这段代码做了以下几件事:

首先在子查询中,选取了 product_name 、 month 和 sales_volume 字段,形成一个中间数据集 SourceTable 。
然后使用 PIVOT 函数,对 SourceTable 中的数据进行行列转换。以 month 字段作为列转行的依据,将每个月对应的 sales_volume 进行聚合求和 。
在外层查询中,用 ISNULL 函数处理那些某个月没有销售数据的情况,将其置为0,同时计算出每个产品全年的总销量。

相关文章:

SQL开窗函数相关的面试题和答案

基本排序与分组问题 题目&#xff1a;有学生成绩表tb_score&#xff0c;包含字段SNO&#xff08;学号&#xff09;、SCLASS&#xff08;班级&#xff09;、CHINESE&#xff08;语文成绩&#xff09;、ENGLISH&#xff08;英语成绩&#xff09;、ARITH&#xff08;数学成绩&…...

【数据分析(一)】初探 Numpy

目录 前言1. 一维 array 的生成2. 一维 array 的基本操作2.1. 查看属性2.2. 花式索引2.3. 条件筛查2.4. 数据统计 3. n 维 array 的生成4. n 维 array 的基本操作4.1. 查看属性4.2. 查询和切片4.3. 花式索引4.4. 矩阵 前言 Numpy是Python的常用开源数值计算扩展库&#xff0c;用…...

国产化ARM平台-飞腾派开发板硬件与系统

国产化ARM平台-飞腾派开发板硬件与系统 一、飞腾E2000处理器 飞腾腾珑E2000系列包括E2000Q、E2000D、E2000S三个系列&#xff0c;芯片集成飞腾自主研发的高能效和低功耗处理器核&#xff0c;E2000Q集成2个FTC664和2个FTC310处理器核&#xff0c;E2000D集成2个FTC310处理器核&…...

[ LeetCode 75 ] 283 移动零(JavaScript)

283 移动零 题目描述解题思路步骤解析时间和空间复杂度代码实现 题目描述 LeetCode 283 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操…...

前端学习汇总

一、打包工具 1.1、vite vite&#xff1a;vite -- 开发环境 热更新_vite 热更新-CSDN博客 1.2、webpack 常用loader&#xff1a;webpack基础---常用loader_webpack 常用loader-CSDN博客 loader&#xff1a;webpack4和webpack5区别1---loader_webpack4与webpack5处理图片的…...

蓝笔科技 | 超凡妈妈赋能计划-【北大生涯规划师特别企划】

12月27日&#xff0c;“超凡妈妈赋能计划-北大生涯规划师特别企划”在广州正式启动&#xff0c;据了解&#xff0c;本次超凡妈妈赋能计划是由广州蓝笔科技信息有限公司牵头发起并主办&#xff0c;中国关心下一代健康体育基金会作为公益支持单位&#xff0c;北京大学作为项目技术…...

【电路笔记 TMS320C6***DSP】C6748 EDMA3配置笔记 寄存器配置+影子通道寄存器+配置示例

目录 参照资料内存映射寄存器分类影子通道寄存器传输中断PaRAM参数SRC、DSTA_B_CNT、CCNTSRC_DST_BIDXSRC_DST_CIDXOPTopt示例 链接传输LINK_BCNTRLD (LinkAddress/BCountReloadParameter)示例代码示例配置&#xff1a;块传输示例配置&#xff1a;矩阵转置示例配置&#xff1a;…...

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …...

apollo内置eureka dashboard授权登录

要确保访问Eureka Server时要求输入账户和密码&#xff0c;需要确保以下几点&#xff1a; 确保 eurekaSecurityEnabled 配置为 true&#xff1a;这个配置项控制是否启用Eureka的安全认证。如果它被设置为 false&#xff0c;即使配置了用户名和密码&#xff0c;也不会启用安全认…...

后台管理系统全屏功能实现

后台管理系统中有一个比较常见的功能就是全屏显示&#xff0c;以方便用最大的屏幕查看系统&#xff0c;特别是在小屏模式下。 对于 screenfull 而言&#xff0c;浏览器本身已经提供了对用的 API&#xff0c;点击这里即可查看&#xff0c;这个 API 中&#xff0c;主要提供了两个…...

风电叶片市场竞争激烈:开启绿色能源新篇章的巨大潜力

一、引言 面对全球气候变化的严峻挑战&#xff0c;可再生能源的开发与利用已成为各国共识。风电&#xff0c;作为技术最成熟、最具规模化开发条件的可再生能源之一&#xff0c;正以前所未有的速度发展。而风电叶片&#xff0c;作为风电机组的核心部件&#xff0c;其技术创新与…...

【Unity3D日常开发】Unity3D中适用WEBGL打开Window文件对话框打开/上传文件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 Unity3D发布的WEBGL程序是不支持直接的I/O操…...

C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件

今天在本文中&#xff0c;我们将尝试使用NPOI库将图像插入到 Excel 文件的特定位置。请将以下逻辑添加到您的写作方法中&#xff0c;在 Excel 文件中添加图像&#xff08;JPEG、PNG&#xff09;,我已经有一个示例 jpeg 文件 - Read-write-excel-npoi.jpg &#xff0c;我们将尝试…...

Lambda expressions in C++ (C++ 中的 lambda 表达式)

Lambda expressions in C {C 中的 lambda 表达式} 1. Parts of a lambda expression (Lambda 表达式的各个部分)1.2. Parameter list (Optional) References lambda /ˈlm.də/&#xff1a;the 11th letter of the Greek alphabet (希腊语字母表的第 11 个字母)https://learn.m…...

【Rust自学】11.4. 用should_panic检查恐慌

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.4.1. 验证错误处理的情况 测试函数出了验证代码的返回值是否正确&#xff0c;还需要验证代码是否如预期的去处理了发生错误的情况。比…...

高斯函数Gaussian绘制matlab

高斯 约翰卡尔弗里德里希高斯&#xff0c;&#xff08;德语&#xff1a;Johann Carl Friedrich Gau&#xff0c;英语&#xff1a;Gauss&#xff0c;拉丁语&#xff1a;Carolus Fridericus Gauss&#xff09;1777年4月30日–1855年2月23日&#xff0c;德国著名数学家、物理学家…...

获取客户端真实IP地址

当处理来自客户端的请求时&#xff0c;尤其是在存在代理服务器的情况下&#xff0c;可能需要考虑多种HTTP请求头&#xff0c;以尽可能准确地获取用户的真实IP地址。以下是考虑了X-Forwarded-For、Proxy-Client-IP、WL-Proxy-Client-IP、HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR的…...

Kotlin学习(一)

1. Kotlin 作用域函数 如果同学们已经在项目中用过 Kotlin 语言&#xff0c;那么一定见过 let 函数&#xff01;因为每当 Kotlin 检测到某个对象可能为空时&#xff0c;会自动帮我们修改为用 let 函数实现&#xff1a;user.name?.let{ textView.text it }。这里的 let 函数就…...

鸿蒙UI开发——日历选择器

1、概 述 在项目开发中&#xff0c;我们时常会用到日历选择器&#xff0c;效果如下&#xff1a; ArkUI已经为我们提供了组件&#xff0c;我们可以直接使用&#xff0c;下面针对日历组件做简单介绍。 2、CalendarPickerDialog 接口定义如下&#xff1a; // 定义日历选择器弹…...

2025-1-9 QT 使用 QXlsx库 读取 .xlsx 文件 —— 导入 QXlsx库以及读取 .xlsx 的源码 实践出真知,你我共勉

文章目录 1. 导入QXlsx库2. 使用 QXlsx库 读取 .xlsx 文件小结 网上有很多教程&#xff0c;但太费劲了&#xff0c;这里有个非常简便的好方法&#xff0c;分享给大家。 1. 导入QXlsx库 转载链接 &#xff1a;https://github.com/QtExcel/QXlsx/blob/master/HowToSetProject.md…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...