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

SQL-窗口函数做题总结

1. dense_rank()

作用返回数据在分组中的排名,相同值排名相同,排名是连续的(不会跳过排名数字)。

语法

DENSE_RANK() OVER (PARTITION BY 列名 ORDER BY 列名 [ASC|DESC])

示例

SELECT name, score,DENSE_RANK() OVER (ORDER BY score DESC) AS rank_num
FROM scores;

2. row_number()

作用返回数据在分组中的行号,即使值相同,行号也是唯一且连续递增的

语法

ROW_NUMBER() OVER (PARTITION BY 列名 ORDER BY 列名 [ASC|DESC])

示例

SELECT name, score,ROW_NUMBER() OVER (ORDER BY score DESC) AS rn
FROM scores;

3. partition by

作用与窗口函数(row_numberrankdense_ranksum 等)结合使用,将数据分成多个分区(组),在每个分区内独立计算

示例

SELECT department,name,salary,ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

4. coalesce()

作用返回参数列表中第一个非 NULL 的值,如果所有参数都为 NULL,则返回 NULL。

COALESCE(expr1, expr2, ...)
SELECT name,COALESCE(bonus, 0) AS bonus_amount
FROM employees;

这样即使 bonus 为 NULL,也会返回 0。

作用:将null值输出为0

5. 向下取整函数:floor()

作用返回小于或等于指定数值的最大整数(向下取整)。

FLOOR(number)

示例

SELECT FLOOR(7.8) AS result;  -- 输出 7
SELECT FLOOR(-7.8) AS result; -- 输出 -8

6、向上取整函数:CEIL() / CEILING()

核心作用

返回 大于或等于指定数值的最小整数(无论数值正负,都向「更大的整数」方向取整)。

语法
-- 两种写法等价,选一个数据库支持的即可
CEIL(number)
CEILING(number)

7. timestampdiff()

作用计算两个日期或时间之间的差值,单位可以是秒、分钟、小时、天、月、年等。

语法

TIMESTAMPDIFF(unit, datetime1, datetime2)

unit 常用值

  • SECOND 秒
  • MINUTE 分钟
  • HOUR 小时
  • DAY 天
  • MONTH 月
  • YEAR 年

示例

SELECT TIMESTAMPDIFF(DAY, '2025-01-01', '2025-10-06') AS days_diff;
-- 输出:278

| **`dense_rank()`** | 窗口函数 | 排名并列时序号相同且连续 | ```sql
SELECT name,DENSE_RANK() OVER (ORDER BY score DESC) AS rk
FROM scores;
``` |
| **`partition by`** | 窗口函数分组 | 将数据分组后在组内计算 | ```sql
SELECT dept, name,SUM(salary) OVER (PARTITION BY dept) AS dept_total
FROM emp;
``` |
| **`coalesce()`** | 空值处理 | 返回第一个非 NULL 值 | ```sql
SELECT COALESCE(bonus, 0) AS bonus_amount
FROM emp;
``` |
| **`floor()`** | 数值函数 | 向下取整 | ```sql
SELECT FLOOR(7.8) AS val; -- 7
``` |
| **`timestampdiff()`** | 时间函数 | 计算两个日期的差值 | ```sql
SELECT TIMESTAMPDIFF(DAY, '2025-01-01', '2025-10-06') AS diff;
``` |---## 📌 小提示
- **排名三兄弟**对比:- `row_number()` → 1,2,3,4...(不重复)- `rank()` → 1,2,2,4...(并列后跳号)- `dense_rank()` → 1,2,2,3...(并列后连续)
- `partition by` 与 `group by` 区别:- `group by` 会聚合数据,只返回每组一行- `partition by` 不会减少行数,只是分组后做计算
- `coalesce()` 常用来替换 NULL 值
- `floor()` 对负数取整时会向更小的整数靠拢(例如 `-7.8` → `-8`)
- `timestampdiff()` 的时间单位在不同数据库可能略有差异(MySQL、PostgreSQL 都支持,但 Oracle 用 `months_between` 等)---如果你愿意,我还可以帮你画一个**窗口函数排名对比的可视化图**,这样你在做题时一眼就能判断用哪个排名函数。  
你要我画吗?这样会更直观。

http://www.dtcms.com/a/449096.html

相关文章:

  • 做商城类网站空间怎么买个人网页生成器
  • Python AI编程在微创手术通过数据分析改善恢复的路径分析(上)
  • 《强化学习数学原理》学习笔记10——策略迭代
  • 《不一样的数据结构之—顺序表》
  • [论文阅读] AI+软件工程(DeBug)| 从11%到53%!双LLM驱动的工业级代码修复方案,Google数据集验证有效
  • 机器视觉的工业镜头有哪些?能做什么?
  • 百度免费建立网站dw网页制作教程div
  • 【Linux实战 】Linux 线程池的设计、实现与单例模式应用
  • flask-sqlalchemy中的flush()
  • 娱乐建设网站中国航天科工集团有限公司
  • 分布式系统相关概念(单体、集群、分布式、分布式集群、微服务)
  • vscode 配置使用pyqt5
  • CSS选择器常见用法
  • 【Docker】Windows Docker 完全入门指南:从安装到实战的全流程记录
  • 从零开始的C++学习生活 4:类和对象(下)
  • 温州做网站优化网站设计培训
  • 18网站推广关于旅行的网站怎样做
  • 做网站赚钱还是企业宣传片推广方案万能模板
  • 视频分享网站怎么做的注册营业执照需要什么资料
  • 网站建设教程赚找湖南岚鸿认 可php无版权企业网站管理系统
  • 建立网站站点的目的一个主机可以做几个网站域名
  • 封面上的网站怎么做网站模块设计软件
  • 网站制作还花钱电子商务网站建设及推广方案论文
  • 淮南服装网站建设地址如何做虚拟币交易网站
  • 网站建设规划表乐清网站建设lonwap
  • 网站开发创业计划书模板网上能免费做网站发布叼
  • 湖南张家界建设局网站深圳本地招聘网站有哪些
  • 分析网站建设前期的seo准备工作广东网络文明大会开幕
  • 贵州城乡和住房建设厅网站天津seo方案
  • 青岛php网站建设wordpress可以做博客么