MySQL: выберите данные в диапазоне дат, если число дат превышает заданное количество

0

Я хочу выбрать набор сотрудников из журнала посещаемости между двумя датами, которые к тому времени пришли на работу более 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 - к 2019-02-01 он проработал 8 дней.
  • Emp 1 - к 2019-02-04 он проработал 11 дней.
  • Emp 2 - к 2019-02-01 он проработал 4 дня.
  • Emp 2 - к 2019-02-05 он проработал 8 дней.
  • Emp 3 - к 2019-02-01 он проработал 10 дней.
  • Emp 3 - К 2019-02-05 он проработал 14 дней.

Таким образом, из вышеуказанного набора данных должны быть выбраны только 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;
  • 0
    Вы можете опубликовать свою структуру таблицы и несколько строк данных?
  • 1
    обновите свой вопрос и добавьте в схему таблиц правильную выборку данных и ожидаемый результат .. (фактическая выборка данных бесполезна)
Показать ещё 1 комментарий
Теги:
group-by

3 ответа

1
Лучший ответ

Вы можете разделить условие даты между 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
0

Я думаю, что вам нужны записи о сотрудниках, рабочие дни которых больше и равны 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
-1

Я думаю, что вам нужно разделить условие даты между 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню