网站单表操作模块开发及SQL查询:获取记录最多的星期几
解决找出记录数最多星期几的SQL查询方案
嘿,看起来你已经迈出了正确的第一步——分组统计每天的课程记录数并排序,但还需要补充筛选逻辑,才能拿到所有并列记录数最多的星期几。我给你两种实用方案,适配不同的数据库场景:
方案一:子查询嵌套(兼容绝大多数数据库)
这种写法不需要依赖高级特性,几乎所有SQL数据库都能运行:
SELECT day, COUNT(*) AS cnt FROM schedule GROUP BY day HAVING COUNT(*) = ( -- 先找出所有星期几记录数中的最大值 SELECT MAX(daily_cnt) FROM ( -- 内层先统计每个星期几的课程记录数 SELECT COUNT(*) AS daily_cnt FROM schedule GROUP BY day ) AS daily_counts );
逻辑说明:
- 最内层子查询按
day分组,算出每个星期几的课程记录数 - 中间子查询从这些统计结果里提取出最大的记录数
- 主查询筛选出记录数等于最大值的星期几和对应数量,自然会返回所有并列第一的结果
方案二:窗口函数(适合支持SQL:2003及以上的数据库,如MySQL8+、PostgreSQL、SQL Server等)
如果你的数据库支持窗口函数,这种写法更简洁优雅:
SELECT day, cnt FROM ( SELECT day, COUNT(*) AS cnt, -- 按记录数降序排名,并列项会得到相同排名 RANK() OVER (ORDER BY COUNT(*) DESC) AS rank_num FROM schedule GROUP BY day ) AS ranked_days WHERE rank_num = 1;
逻辑说明:
- 内层先分组统计每个星期几的记录数,同时用
RANK()窗口函数给每个分组按记录数从高到低排名 - 外层查询直接筛选出排名为1的记录,所有并列记录数最多的星期几都会被保留
补充提示:
你原来写的ORDER BY cnt DESC只能实现排序,但如果用LIMIT 1只能拿到单个结果,没法处理多个并列最大值的情况,所以必须用上面的筛选逻辑覆盖这种场景。
内容的提问来源于stack exchange,提问作者irina
相关产品推荐
相关产品推荐

