Oracle技术问询:如何查询过去一年预订超5次的员工并去重排序
解决方案:获取过去日历年预订超5次的员工名单
我来帮你搞定这个需求!首先咱们得拆解你提到的两个核心难点,然后一步步修正你的SQL代码,实现动态年份计算、过滤高频预订员工并排序的目标。
核心问题分析
你原来的SQL用了DISTINCT但没做分组统计,而且没有处理动态年份范围,这就导致没法准确统计每个员工的总预订次数,自然得不到想要的结果。咱们需要调整思路:先锁定过去日历年的时间范围,再按员工分组统计次数,最后过滤出符合条件的记录。
动态计算过去日历年的时间范围
不同数据库的语法略有差异,这里给你主流数据库的实现方式:
- MySQL/MariaDB:通过当前年份减1,构造当年的起始和结束日期
-- 过去日历年的开始日期:去年1月1日 DATE_FORMAT(NOW(), '%Y-01-01') - INTERVAL 1 YEAR -- 过去日历年的结束日期:去年12月31日 DATE_FORMAT(NOW(), '%Y-12-31') - INTERVAL 1 YEAR - PostgreSQL:用
DATE_TRUNC截断年份后偏移-- 过去日历年的开始日期 DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 year' -- 过去日历年的结束日期 DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 day' - SQL Server:通过日期差计算年份偏移
-- 过去日历年的开始日期 DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0) -- 过去日历年的结束日期 DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) - 1
完整SQL代码示例(以MySQL为例)
SELECT FIRSTNAME, SURNAME, COUNT(BOOKINGID) AS total_bookings FROM your_booking_table_name -- 替换成你的实际表名 WHERE DATEBOOKED BETWEEN DATE_FORMAT(NOW(), '%Y-01-01') - INTERVAL 1 YEAR AND DATE_FORMAT(NOW(), '%Y-12-31') - INTERVAL 1 YEAR GROUP BY FIRSTNAME, SURNAME -- 若有员工ID,优先用员工ID分组(避免同名问题) HAVING total_bookings > 5 ORDER BY total_bookings DESC;
代码说明
- 动态年份:通过
DATE_FORMAT和INTERVAL自动计算去年的完整日历区间,不需要硬编码年份,每年都能自动适配。 - 分组统计:用
GROUP BY按员工姓名(或员工ID)分组,COUNT(BOOKINGID)统计每个员工的总预订次数。 - 过滤条件:
HAVING total_bookings >5只保留预订次数超过5次的员工(注意这里用HAVING而非WHERE,因为是对分组后的统计结果过滤)。 - 排序:
ORDER BY total_bookings DESC按预订次数从多到少排序,方便查看高频预订员工。
额外建议
如果你的表中有唯一标识员工的字段(比如EMPLOYEEID),建议用EMPLOYEEID来分组,避免出现同名员工被合并统计的问题,调整后的GROUP BY子句为:GROUP BY EMPLOYEEID, FIRSTNAME, SURNAME。
内容的提问来源于stack exchange,提问作者Prime
相关产品推荐
相关产品推荐

