如何通过PostgreSQL的MODE()函数查找分组数据中的众数,实现基础统计查询?
- 内容介绍
- 相关推荐
本文共计1019个文字,预计阅读时间需要5分钟。
PostgreSQL 14及以上版本原生支持使用MODE作为聚合函数(需配合WITHIN GROUP (ORDER BY ...)使用),仅支持单列、非空值和确定性排序。如果使用的是13或更早版本,直接使用MODE会报错ERROR: function mode() does not exist。
在这种情况下,不要慌张,可以通过升级到PostgreSQL 14或更高版本来解决。在多数场景下,使用GROUP BY + COUNT()配合窗口函数就能达到相同的效果,并且更加灵活可控。
- 14+ 中正确写法是:
MODE() WITHIN GROUP (ORDER BY col),不是MODE(col) - 该函数要求
col不能含NULL,否则整个分组返回NULL - 若多个值并列最高频(如 [a,a,b,b,c]),PostgreSQL 只返回排序靠前的那个(依赖
ORDER BY规则),不报错也不警告
用 ROW_NUMBER() + COUNT() 实现兼容所有版本的众数
这是最稳妥、可读性高、且能处理并列众数的写法。核心思路:先按分组和值计数,再对每个分组内按频次降序排号,取 rn = 1 的记录。
本文共计1019个文字,预计阅读时间需要5分钟。
PostgreSQL 14及以上版本原生支持使用MODE作为聚合函数(需配合WITHIN GROUP (ORDER BY ...)使用),仅支持单列、非空值和确定性排序。如果使用的是13或更早版本,直接使用MODE会报错ERROR: function mode() does not exist。
在这种情况下,不要慌张,可以通过升级到PostgreSQL 14或更高版本来解决。在多数场景下,使用GROUP BY + COUNT()配合窗口函数就能达到相同的效果,并且更加灵活可控。
- 14+ 中正确写法是:
MODE() WITHIN GROUP (ORDER BY col),不是MODE(col) - 该函数要求
col不能含NULL,否则整个分组返回NULL - 若多个值并列最高频(如 [a,a,b,b,c]),PostgreSQL 只返回排序靠前的那个(依赖
ORDER BY规则),不报错也不警告
用 ROW_NUMBER() + COUNT() 实现兼容所有版本的众数
这是最稳妥、可读性高、且能处理并列众数的写法。核心思路:先按分组和值计数,再对每个分组内按频次降序排号,取 rn = 1 的记录。

