SQL如何快速提取分组中最晚时间点数据_结合窗口函数实现

用 ROW_NUMBER() 按组内时间倒序标号可精准取每组最新一条记录,避免 RANK()/DENSE_RANK() 因并列时间导致多返回、不可控等问题,且比 GROUP BY + MAX() 关联更可靠;需注意 NULL 处理、分区键一致性及排序稳定性。用 ROW_NUMBER() 按组内时间倒序标号核心思路是给每组数据按 created_at(或你的时间字段)降序排个名,取名次为 1 的那条。这比 GROUP BY + MAX() 再关联回原表更直接、也更可靠------后者在有并列最晚时间时可能漏数据。实操建议:确保时间字段不为空,否则 NULL 会被排到最后(ORDER BY xxx DESC 默认把 NULL 当最小值),导致标号错乱;可加 WHERE created_at IS NOT NULL 过滤分区键(PARTITION BY)必须和业务分组逻辑一致,比如按 user_id 分组就写 PARTITION BY user_id,别漏掉复合条件如 PARTITION BY tenant_id, user_id排序用 ORDER BY created_at DESC,如果时间精度到秒但存在微秒级差异,建议显式补上 , id DESC 防止窗口函数随机选行(尤其 PostgreSQL / MySQL 8.0+)SELECT * FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY created_at DESC, id DESC ) AS rn FROM orders) t WHERE rn = 1;RANK() 和 DENSE_RANK() 什么时候不能替代 ROW_NUMBER()当同一组里有多条记录时间完全相同时,RANK() 会把它们全标为 1,接着跳到 3;DENSE_RANK() 也是全标 1,接着标 2。如果你只要一条"最晚记录",这两种函数会导致结果多于预期------尤其是做 UPDATE 或 INSERT SELECT 时容易重复写入。常见错误现象:本想每用户取一条最新订单,结果某用户有两条同秒创建的订单,RANK() 返回了两条,下游逻辑崩了用 DENSE_RANK() 后接 WHERE dr = 1,看似没问题,但实际无法控制哪条被保留,不同执行计划下结果不一致Oracle 中 RANK() 对 NULL 的处理和 ROW_NUMBER() 不同,混用易出错MySQL 5.7 或旧版 PostgreSQL 怎么办这些版本不支持窗口函数,硬上 ROW_NUMBER() 会报错 FUNCTION xxx does not exist 或直接语法失败。得换策略,但别用相关子查询(WHERE time = (SELECT MAX(...) FROM ...)),它在大数据量下极慢,且仍无法解决并列时间问题。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
minji...16 分钟前
MySQL数据库 (五) MySQL表的约束(上),非空约束,默认值约束,零填充约束,主键约束,符合主键
数据库·mysql·表的约束·主键约束·非空约束·复合主键·零填充约束
李可以量化20 分钟前
量化之MiniQMT 实战:一键读取通达信自选股并实时监控涨跌幅(附完整可运行代码)
开发语言·python·量化·qmt·ptrade
拾贰_C33 分钟前
【python | installation 】python 安装 | Windows | 命令使用
linux·数据库·ubuntu
CTA量化套保34 分钟前
一个账户跑多个期货策略:仓位与报单隔离思路
python·区块链
机汇五金_35 分钟前
影响交换机箱体使用寿命的几个关键因素
运维·服务器·网络·python
子午37 分钟前
基于DeepSeek的酒店客房管理系统~Python+DeepSeek智能问答+Vue3+Web网站系统
开发语言·前端·python
编程大师哥42 分钟前
最高效的 IO 并发方案
linux·网络·python
Hello:CodeWorld43 分钟前
Dify 从入门到实战:部署、模型对接与企业级 AI 应用开发全教程
人工智能·python·架构·ai编程
贺今宵44 分钟前
Vue 3 + Capacitor 使用jeep-sqlite,web端使用本地sqlite数据库
前端·数据库·vue.js·sqlite·web
本地化文档1 小时前
black-docs-l10n
python·github·gitcode·sphinx