SQL-窗口函数做题总结

1. dense_rank()

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

语法

sql 复制代码
DENSE_RANK() OVER (PARTITION BY 列名 ORDER BY 列名 [ASC|DESC])

示例

sql 复制代码
SELECT 
    name, 
    score,
    DENSE_RANK() OVER (ORDER BY score DESC) AS rank_num
FROM scores;

2. row_number()

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

语法

sql 复制代码
ROW_NUMBER() OVER (PARTITION BY 列名 ORDER BY 列名 [ASC|DESC])

示例

sql 复制代码
SELECT 
    name, 
    score,
    ROW_NUMBER() OVER (ORDER BY score DESC) AS rn
FROM scores;

3. partition by

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

示例

sql 复制代码
SELECT 
    department,
    name,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

4. coalesce()

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

sql 复制代码
COALESCE(expr1, expr2, ...)
sql 复制代码
SELECT 
    name,
    COALESCE(bonus, 0) AS bonus_amount
FROM employees;

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

作用:将null值输出为0

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

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

sql 复制代码
FLOOR(number)

示例

sql 复制代码
SELECT FLOOR(7.8) AS result;  -- 输出 7
SELECT FLOOR(-7.8) AS result; -- 输出 -8

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

核心作用

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

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

7. timestampdiff()

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

语法

sql 复制代码
TIMESTAMPDIFF(unit, datetime1, datetime2)

unit 常用值

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

示例

sql 复制代码
SELECT TIMESTAMPDIFF(DAY, '2025-01-01', '2025-10-06') AS days_diff;
-- 输出:278
XML 复制代码
| **`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` 等)

---

如果你愿意,我还可以帮你画一个**窗口函数排名对比的可视化图**,这样你在做题时一眼就能判断用哪个排名函数。  
你要我画吗?这样会更直观。
相关推荐
qq_12498707534 小时前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
倒流时光三十年5 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉5 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣505 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx5 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星6 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发6 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐6 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly6 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客6 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索