You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码说明

  1. 动态年份:通过DATE_FORMAT和INTERVAL自动计算去年的完整日历区间,不需要硬编码年份,每年都能自动适配。
  2. 分组统计:用GROUP BY按员工姓名(或员工ID)分组,COUNT(BOOKINGID)统计每个员工的总预订次数。
  3. 过滤条件:HAVING total_bookings >5只保留预订次数超过5次的员工(注意这里用HAVING而非WHERE,因为是对分组后的统计结果过滤)。
  4. 排序:ORDER BY total_bookings DESC按预订次数从多到少排序,方便查看高频预订员工。

额外建议

如果你的表中有唯一标识员工的字段(比如EMPLOYEEID),建议用EMPLOYEEID来分组,避免出现同名员工被合并统计的问题,调整后的GROUP BY子句为:GROUP BY EMPLOYEEID, FIRSTNAME, SURNAME。

内容的提问来源于stack exchange,提问作者Prime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:01:17