Я работаю над веб-приложением, которое позволяет пользователю создавать специальные запросы к базе данных сотрудников. Запросы разрабатываются в веб-интерфейсе AJAX, где пользователь указывает группы критериев, которые пересекаются вместе, я пытаюсь добавить функциональность, чтобы также позволить пользователю вводить отношения даты между критериями. Например, вот пример (проблемный) сгенерированного кода для запроса, который гласит: «Дайте мне всех сотрудников, у которых было не менее 3 проверок через 150+ дней после начала работы» *
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
Как вы заметили, каждый критерий из пользовательского интерфейса генерируется в блок SQL SELECT
, все они пересекаются вместе. Вот моя проблема:
Приведенный выше запрос проверяет, имел ли сотрудник как минимум 3 аудита, и последний аудит MAX
происходит через 150 дней после даты начала INSTEAD, равной the 3 audits occur 150+ after start date
.
Вы можете спросить: "ну, тогда почему у вас есть оператор max (audit_date)?" Причина в том, что для работы группы мне нужна агрегатная функция (здесь группа создается из критериев высокого уровня «встречается как минимум 3 раза»).
Итак, что я могу добавить к этому коду (без особых изменений, потому что я хотел бы сохранить этот механизм генерации кода), чтобы я теперь проверял, чтобы все эти 3 события / проверки происходили спустя 150+ дней (вместо этого только макс) ??
Спасибо!