如何修改SQL语句统计所有存在重名的学生总数?
如何修改SQL以统计所有重名学生的总人数
你原来的SQL语句会按每个重复的名字单独输出对应学生数量,要得到所有存在重名的学生总人数,可以通过子查询求和或者窗口函数筛选统计两种方式实现:
方法一:子查询求和
先通过子查询筛选出所有重复名字的分组及对应人数,再在外层对这些人数求和:
SELECT SUM(name_count) AS total_duplicate_students FROM ( SELECT COUNT(id) AS name_count FROM student GROUP BY LOWER(first_name) HAVING COUNT(LOWER(first_name)) > 1 ) AS duplicate_groups;
逻辑说明:
- 内层子查询按小写的
first_name分组,筛选出重复次数≥2的分组,得到每个重名对应的学生数 - 外层查询将这些分组的人数相加,得到所有重名学生的总人数
方法二:窗口函数统计
给每个学生标记其名字的重复次数,再筛选出重复次数≥2的学生并统计总数:
SELECT COUNT(id) AS total_duplicate_students FROM ( SELECT id, COUNT(*) OVER (PARTITION BY LOWER(first_name)) AS name_count FROM student ) AS student_counts WHERE name_count > 1;
逻辑说明:
- 内层用窗口函数
COUNT(*) OVER (PARTITION BY LOWER(first_name)),给每个学生计算其名字在表中的重复次数 - 外层筛选出重复次数大于1的学生,统计这些学生的ID总数,就是所有重名学生的总人数
两种方法都能得到你需要的结果,可根据自己的SQL环境和习惯选择。
内容的提问来源于stack exchange,提问作者Andrij Matviiv
相关产品推荐
相关产品推荐

