问题描述
|
我正在开发一个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中的每个条件都生成到一个SQLSELECT
块中,所有条件都交叉在一起。这是我的问题:
上面的查询检查员工是否至少进行了3次审核,上一次审核“ 2”发生在开始日期INSTEAD为“ 3”之后150天。
您可能会问:“好吧,那为什么要有一个max(audit_date)语句?”原因是我需要一个汇总函数才能使group by工作(此处的组是从(至少出现3次)高级查询条件)。
因此,我可以在此代码中添加什么(无需进行太多更改,因为我想保留此代码生成机制),以便我现在检查所有这3次事件/审核都在150天后发生(而不是只有最大的一个)?
谢谢!
解决方法
听起来您需要研究窗口函数,可能还需要研究Have子句而不是where子句。