Я хочу выбрать набор сотрудников из журнала посещаемости между двумя датами, которые к тому времени пришли на работу более 10 дней. Так, чтобы работодатель уже превысил 10 дней или может превысить 10 дней в течение проверенного диапазона дат. Таблица журнала (см. Ниже) содержит одну запись для каждого работодателя на каждый день.
emp_id | date
1 | 2019-01-25
1 | 2019-01-26
1 | 2019-01-27
1 | 2019-01-28
1 | 2019-01-29
1 | 2019-01-30
1 | 2019-01-31
1 | 2019-02-01
1 | 2019-02-02
1 | 2019-02-03
1 | 2019-02-04
2 | 2019-01-29
2 | 2019-01-30
2 | 2019-01-31
2 | 2019-02-01
2 | 2019-02-02
2 | 2019-02-03
2 | 2019-02-04
2 | 2019-02-05
3 | 2019-01-23
3 | 2019-01-24
3 | 2019-01-25
3 | 2019-01-26
3 | 2019-01-27
3 | 2019-01-28
3 | 2019-01-29
3 | 2019-01-30
3 | 2019-01-31
3 | 2019-02-01
3 | 2019-02-02
Выбор диапазона дат с 2019-02-01 по 2019-02-05.
Таким образом, из вышеуказанного набора данных должны быть выбраны только Emp 1 и Emp 3. Работодатель должен превышать 10 дней в пределах диапазона дат.
Я написал следующий запрос в MySQL, но он не работает. Как это должно быть написано?
SELECT emp_id FROM log
WHERE date BETWEEn '2019-02-01' AND '2019-02-05'
GROUP BY emp_id
HAVING COUNT(emp_id) > 14;
Вы можете разделить условие даты между WHERE
и HAVING
:
SELECT emp_id
FROM log
WHERE date <= '2019-02-05' -- select all entries until this date
GROUP BY emp_id
HAVING MAX(date) >= '2019-02-01' -- employee has at least one log entry on / after this date
AND COUNT(emp_id) > 10 -- more than 10 entries between the two dates
Я думаю, что вам нужны записи о сотрудниках, рабочие дни которых больше и равны 10. Таким образом, вы можете применить подзапрос, который может сформулировать количество этих сотрудников и вернуть результат обратно в основной запрос.
SELECT l1.emp_id FROM log l1
WHERE (select Count(*) from log l2
where l1.emp_id=l2.emp_id
&& l2.date BETWEEN '2019-02-01' AND '2019-02-05') >=10
Я думаю, что вам нужно разделить условие даты между WHERE
и HAVING
:
SELECT emp_id
FROM log
WHERE date <= '2019-02-05' -- select all dates until this date
GROUP BY emp_id
HAVING MAX(date) >= '2019-02-01' -- employee has at least one log entry on / after
AND COUNT(emp_id) > 10 -- and has 10+ days of attendance