如何使用SQL按STORE_ID分组统计最高频营业时间及对应占比
结论
仅通过SQL语句完全可以实现该统计需求,以下是具体实现方案。
实现逻辑
- 第一层聚合:按
STORE_ID、OPENING_HOUR分组,统计每个门店各开门小时的出现次数,同时计算对应门店的总营业记录数 - 第二层排序:对每个门店下的所有开门小时,按出现次数倒序排序,同时计算各小时的频率占比
- 结果过滤:取每个门店排序第一位的记录,即为该门店出现频率最高的开门小时及对应占比
参考SQL
WITH stat_info AS ( SELECT STORE_ID, OPENING_HOUR, COUNT(1) AS hour_count, SUM(COUNT(1)) OVER (PARTITION BY STORE_ID) AS store_total_count FROM BUSINESS_HOURS GROUP BY STORE_ID, OPENING_HOUR ), rank_info AS ( SELECT STORE_ID, OPENING_HOUR, ROUND(hour_count * 1.0 / store_total_count, 1) AS FREQUENCY, ROW_NUMBER() OVER (PARTITION BY STORE_ID ORDER BY hour_count DESC) AS rank_num FROM stat_info ) SELECT STORE_ID, OPENING_HOUR, FREQUENCY FROM rank_info WHERE rank_num = 1;
补充说明
- 如果需要返回并列最高的所有开门小时,可将
ROW_NUMBER()替换为RANK()函数 - 代码中频率默认保留1位小数,可根据需求调整
ROUND函数的第二个参数修改精度 - 该SQL兼容所有支持窗口函数的主流数据库,包括MySQL 8.0+、PostgreSQL、Oracle、SQL Server等
内容的提问来源于stack exchange,提问作者Marcos Dias
相关产品推荐
相关产品推荐

