我正在开发一个web应用程序,它允许用户针对员工数据库设计即席查询。查询是在一个基于AJAX web的界面中设计的,在那里用户指定了一组相交的规则,我正在尝试添加功能,以允许用户引入规则之间的日期关系。例如,下面是一个示例(有问题的)生成的查询代码,该代码表示“the me all employees 150+ all all employees that至少有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次审计,最后一次审计MAX发生在开始日期后150天,而不是the 3 audits occur 150+ after start date。
您可能会问,“那么,为什么有一个max(audit_date)语句呢?”原因是我需要有一个聚合函数,以便group by工作(这里的group是根据“至少发生3次”的高级查询条件生成的)。
那么,我可以向这段代码添加什么(不需要太多更改,因为我想保留这个代码生成机制),这样我现在就可以检查所有这3次发生/审计是否都发生在150+天之后(而不仅仅是最大的一次)?
谢谢!
发布于 2011-05-26 03:37:10
听起来您需要查看window functions,可能还需要查看having子句,而不是where子句。
https://stackoverflow.com/questions/6129102
复制相似问题