PostgreSQL 如何用 DISTINCT ON 实现分组取最新记录-SQL

DISTINCT ON是PostgreSQL特有语法,用于每组保留排序后的首行;而DISTINCT是对整行全字段去重。DISTINCT ON必须与ORDER BY配合,且ORDER BY前导列须与DISTINCT ON列一致并同序。

DISTINCT ON 是什么,和普通 DISTINCT 有什么区别

DISTINCT ON 不是标准 SQL,是 PostgreSQL 特有的语法,用来在去重时保留“每组第一条”记录,而不是像 DISTINCT 那样对整行做全字段比对。它必须配合 ORDER BY 使用,且 ORDER BY 的前导列要和 DISTINCT ON 的列完全一致(顺序也要一致),否则会报错:SELECT DISTINCT ON expressions must match initial ORDER BY expressions。

典型场景是“每个用户取最新一条订单”“每个设备取最近一次上报”——这类需求用 GROUP BY 很难直接满足,因为非分组字段的聚合逻辑不明确;而 DISTINCT ON 能靠排序天然定义“最新”。

怎么写才能正确取出每组最新记录

核心是:把分组字段放在 DISTINCT ON 里,把时间戳/序号字段放在 ORDER BY 的后续位置,并按降序排(DESC)。

  • DISTINCT ON (user_id) 表示“每个 user_id 只留一行”
  • ORDER BY user_id, created_at DESC 确保同一 user_id 下,created_at 最大的那条排最前,被 DISTINCT ON 拿到
  • 如果漏掉 user_id 在 ORDER BY 的开头,会直接报错
  • 如果 created_at 允许 NULL,记得加 NULLS LAST,避免 NULL 被当成“最新”

示例:

SELECT DISTINCT ON (user_id) *
FROM orders
ORDER BY user_id, created_at DESC NULLS LAST;

为什么不能只靠 ORDER BY + LIMIT 1?

单独用 ORDER BY created_at DESC LIMIT 1 只能取全局最新一条,不是“每组最新”。有人试图用子查询或窗口函数替代,但 DISTINCT ON 在多数情况下更简洁、可读性更高、执行计划也更可控。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PostgreSQL 如何用 DISTINCT ON 实现分组取最新记录-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4041264+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4041264+
  • 本周更新: 0+
  • 最后更新: 2026-03-16