在SQL的实际使用中,我们经常会遇到需要统计非数值字段出现频率并排序的需求,比如统计不同部门的人员数量排名、不同标签的使用频次排序等。这类需求如果采用传统的分组后关联的方式实现,需要写多个子查询,逻辑复杂且执行效率不高。而使用COUNT配合OVER窗口函数,可以一步完成频率统计和排名,大幅简化SQL逻辑。

COUNT OVER语法基础
COUNT是SQL中常用的聚合函数,用于统计行数,而OVER子句可以将聚合函数转换为窗口函数,在不改变原表行数的前提下,为每一行添加聚合计算结果。当我们需要统计非数值字段的频率时,只需要在OVER子句中指定要统计的字段作为分区依据即可。
COUNT OVER的基本语法结构如下:
COUNT(*) OVER (PARTITION BY 非数值字段名) AS 频率值
其中PARTITION BY后面跟着的就是我们要统计频率的非数值字段,COUNT(*)会统计每个分区内的行数,也就是该字段值出现的次数,这个结果会作为新列添加到原表的每一行中。
非数值字段频率排名实现步骤
1. 准备测试数据
我们首先创建一个测试表,存储用户的所属部门信息,部门字段是字符串类型的非数值字段,用来演示频率排名的实现:
-- 创建测试表
CREATE TABLE user_dept (
user_id INT,
dept_name VARCHAR(50)
);
-- 插入测试数据
INSERT INTO user_dept (user_id, dept_name) VALUES
(1, '技术部'),
(2, '技术部'),
(3, '技术部'),
(4, '产品部'),
(5, '产品部'),
(6, '运营部'),
(7, '人事部'),
(8, '人事部'),
(9, '人事部'),
(10, '人事部');
2. 统计非数值字段的频率
使用COUNT OVER语法统计每个部门的出现次数,也就是每个部门的用户数量:
SELECT
user_id,
dept_name,
COUNT(*) OVER (PARTITION BY dept_name) AS dept_count
FROM user_dept;
执行上述SQL后,会得到如下结果:
| user_id | dept_name | dept_count |
|---|---|---|
| 1 | 技术部 | 3 |
| 2 | 技术部 | 3 |
| 3 | 技术部 | 3 |
| 4 | 产品部 | 2 |
| 5 | 产品部 | 2 |
| 6 | 运营部 | 1 |
| 7 | 人事部 | 4 |
| 8 | 人事部 | 4 |
| 9 | 人事部 | >4 |
| 10 | 人事部 | 4 |
3. 对频率进行排名
在得到频率值之后,我们可以再配合RANK或者DENSE_RANK窗口函数,对频率进行排名,得到最终的排名结果:
SELECT
dept_name,
dept_count,
RANK() OVER (ORDER BY dept_count DESC) AS freq_rank
FROM (
SELECT DISTINCT
dept_name,
COUNT(*) OVER (PARTITION BY dept_name) AS dept_count
FROM user_dept
) t;
执行上述SQL后,会得到每个部门的频率以及对应的排名:
| dept_name | dept_count | freq_rank |
|---|---|---|
| 人事部 | 4 | 1 |
| 技术部 | 3 | 2 |
| 产品部 | 2 | 3 |
| 运营部 | 1 | 4 |
注意事项
- COUNT OVER中的PARTITION BY后面可以跟多个非数值字段,实现多字段组合的频率统计,比如同时按部门和岗位统计频率。
- 如果需要去重统计频率,可以使用COUNT(DISTINCT 字段名) OVER (PARTITION BY 分区字段)的语法,不过需要注意部分数据库可能不支持这种写法,比如MySQL 8.0之前版本不支持COUNT DISTINCT配合OVER使用。
- RANK和DENSE_RANK的区别是,RANK会出现并列排名后跳号的情况,DENSE_RANK并列排名后不跳号,根据实际需求选择即可。
- 如果非数值字段存在NULL值,COUNT(*)会把NULL值的行也统计进去,如果需要排除NULL值,可以使用COUNT(字段名) OVER的语法,NULL值不会被计入统计。
总结
利用COUNT OVER语法实现非数值字段的频率排名,不需要复杂的子查询关联,逻辑清晰且执行效率高。只需要先通过COUNT OVER按目标非数值字段分区统计频率,再配合排名窗口函数对频率排序即可完成需求。这种方法适用于所有支持窗口函数的SQL数据库,比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等,是处理非数值字段频率排名的高效方案。
SQLCOUNT_OVER频率排名非数值字段修改时间:2026-06-28 06:12:32