Вопрос генерации кода SQL, группировка по и агрегаты - PullRequest
1 голос
/ 25 мая 2011

Я работаю над веб-приложением, которое позволяет пользователю создавать специальные запросы к базе данных сотрудников. Запросы разрабатываются в веб-интерфейсе 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+ дней (вместо этого только макс) ??

Спасибо!

1 Ответ

1 голос
/ 25 мая 2011

Похоже, вам нужно изучить оконные функции и, возможно, с предложением вместо предложения where.

...