MODE
简介
MODE
MODE
函数用于返回一组数据中出现次数最多的值(众数)。当多个值出现频次相同时,返回哪个值不确定。
语法
MODE(expr) [FILTER (WHERE condition)]
参数
返回结果
- 返回类型与
expr
expr
的类型一致。
- 忽略
NULL
NULL
值,NULL
NULL
不参与频次统计。
- 若所有值均为
NULL
NULL
,则返回 NULL
NULL
。
- 当多个值出现频次相同时,返回结果不确定(非确定性函数),不要在示例或业务逻辑中依赖具体返回值。
示例
- 基础用法,返回出现次数最多的值:
SELECT MODE(v) FROM (VALUES (1),(2),(2),(3)) t(v);
+---------+
| mode(v) |
+---------+
| 2 |
+---------+
- 结合 GROUP BY 按分组计算众数:
SELECT dept, MODE(score)
FROM (VALUES ('A', 90), ('A', 90), ('A', 80), ('B', 70), ('B', 70), ('B', 90)) t(dept, score)
GROUP BY dept;
+------+-------------+
| dept | mode(score) |
+------+-------------+
| A | 90 |
| B | 70 |
+------+-------------+
- 平局时结果不确定——多个值频次相同时,返回值由引擎内部决定,不保证固定顺序:
-- 1 和 2 各出现 2 次,返回哪个值不确定
SELECT MODE(v) FROM (VALUES (1),(1),(2),(2)) t(v);
+---------+
| mode(v) |
+---------+
| 1 |
+---------+
⚠️ 注意:平局场景下实际返回值可能随数据分布或执行计划变化,不要在业务逻辑中依赖具体返回值。
- 使用 FILTER 子句条件性地计算众数:
SELECT MODE(v) FILTER (WHERE v > 1) FROM (VALUES (1),(2),(2),(3)) t(v);
+----------------------------------+
| mode(v) FILTER (WHERE (v > 1)) |
+----------------------------------+
| 2 |
+----------------------------------+