MySQL技巧:利用窗口函数高效去重,告别嵌套子查询

简介: MySQL技巧:利用窗口函数高效去重,告别嵌套子查询

MySQL技巧:利用窗口函数高效去重,告别嵌套子查询

日常开发中,数据去重是一个高频需求。很多同学第一时间想到 GROUP BYDISTINCT,但遇到“保留每组中最新一条记录”这类场景时,往往会写出多层嵌套子查询,性能差且可读性低。

其实,MySQL 8.0 引入的窗口函数可以优雅解决这个问题。

典型场景:保留每个用户的最新订单

假设有一张订单表 user_orders,包含 user_idorder_amountcreate_time。现在需要为每个用户保留最新的一条订单记录。

低效写法(传统子查询)

SELECT uo.* 
FROM user_orders uo
INNER JOIN (
    SELECT user_id, MAX(create_time) AS max_time
    FROM user_orders
    GROUP BY user_id
) t ON uo.user_id = t.user_id AND uo.create_time = t.max_time;

高效写法(窗口函数)

WITH ranked AS (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS rn
    FROM user_orders
)
SELECT * FROM ranked WHERE rn = 1;

优点解析

  • 简洁清晰:一条 ROW_NUMBER() 直接表达“分组排序取第一”的意图。
  • 性能更好:窗口函数只需扫描一次表,而传统自连接或子查询往往需要多次扫描。
  • 灵活扩展:将 rn = 1 改为 rn <= 3 即可获取每个用户最新的3条订单,无需改写复杂逻辑。

小提示

如果 MySQL 版本低于 8.0,可以使用用户变量模拟窗口函数,但升级到 8.0 以上才是长久之计。窗口函数还能轻松实现累计和、移动平均等高级分析,值得深入学习。

下次遇到“每组取Top N”的需求,试试窗口函数,让你的SQL更优雅。

相关文章
|
4月前
|
人工智能 Linux API
VS Code 1.113 发布:Agent 与 Chat 体验全面升级!
VS Code 1.113 正式发布!聚焦AI开发体验升级:全面增强Agent能力(支持CLI/Claude代理的MCP、会话分支、嵌套子代理、调试日志),优化Chat体验(统一自定义编辑器、模型推理努力直调、图像预览查看器),大幅提升智能编程效率。
959 12
|
4月前
|
数据采集 人工智能 搜索推荐
别再把AI当搜索引擎用了!3个提示词技巧,让你的工作效率翻倍
别再把AI当搜索引擎用了!3个提示词技巧,让你的工作效率翻倍
433 148
|
5月前
|
SQL 关系型数据库 MySQL
MySQL 技巧:用好窗口函数,告别复杂子查询
MySQL 技巧:用好窗口函数,告别复杂子查询
|
5月前
|
关系型数据库 MySQL Serverless
MySQL 技巧:巧用窗口函数计算累计值
MySQL 技巧:巧用窗口函数计算累计值
|
5月前
|
SQL 关系型数据库 MySQL
5个提升MySQL查询效率的实用技巧
5个提升MySQL查询效率的实用技巧
|
固态存储 安全 Java
Maven settings.xml 最全配置详解:从入门到精通
本文深入讲解了 Maven settings.xml 的完整配置项,包含本地仓库路径、镜像源配置、代理设置、认证信息、Profile 多环境切换等核心内容。通过 10 个实战案例展示了企业级配置最佳实践,提供可直接使用的配置文件模板。掌握这些技能,你将能够轻松应对团队标准化、私服集成、多环境部署等场景。适合 Java 开发者、DevOps 工程师阅读。
Maven settings.xml 最全配置详解:从入门到精通
|
5月前
|
PHP 索引
PHP 技巧:用 `array_map` 一键处理数组,告别 `foreach` 噩梦
PHP 技巧:用 `array_map` 一键处理数组,告别 `foreach` 噩梦
483 141
|
5月前
|
关系型数据库 MySQL 索引
5个让MySQL查询飞起来的实用技巧
5个让MySQL查询飞起来的实用技巧
|
5月前
|
安全 PHP
PHP 技巧:5 个提升代码质量的实用写法
PHP 技巧:5 个提升代码质量的实用写法
288 144
|
5月前
|
安全 PHP 索引
PHP 技巧:5个让你代码更优雅的实用函数
PHP 技巧:5个让你代码更优雅的实用函数
291 139