SQL代码生成问题,分组依据和汇总

问题描述

| 我正在开发一个Web应用程序,该应用程序使用户可以针对员工数据库设计临时查询。这些查询是在基于AJAX Web的界面中设计的,用户在其中指定相互交叉的crtieria组,我试图添加功能以也允许用户介绍crtieria之间的日期关系。例如,这是一个示例的(有问题的)生成的查询代码,内容为“给我所有在开始工作150天以上至少经过3次审核的员工”
select * FROM  
    (   
        SELECT employee_id,max(employee_start_date) employee_start_date  
        from employees 
        where employee_salary_type in (55,66,77) 
    group by employee_id having count(*) >= 1
   ) employee_criteria_1,( 
   SELECT employee_id,max(audit_date) audit_date  
       from employees 
   where job_audit_id in (5,6,7)  
   -- They had at least 3 audits
  group by employee_id having count(*) >= 3     
) employee_criteria_2
WHERE 
     employee_criteria_1.employee_id = employee_criteria_2.employee_id 
  -- The audits must have happened at least 150 days after employee\'s start date
   and   employee_criteria_2.audit_date > employee_criteria_1.employee_start_date + 150
您会注意到,UI中的每个条件都生成到一个SQL
SELECT
块中,所有条件都交叉在一起。这是我的问题: 上面的查询检查员工是否至少进行了3次审核,上一次审核“ 2”发生在开始日期INSTEAD为“ 3”之后150天。 您可能会问:“好吧,那为什么要有一个max(audit_date)语句?”原因是我需要一个汇总函数才能使group by工作(此处的组是从(至少出现3次)高级查询条件)。 因此,我可以在此代码中添加什么(无需进行太多更改,因为我想保留此代码生成机制),以便我现在检查所有这3次事件/审核都在150天后发生(而不是只有最大的一个)? 谢谢!     

解决方法

听起来您需要研究窗口函数,可能还需要研究Have子句而不是where子句。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...