Получение списка сотрудников, которые отсутствуют постоянно 3 дня и 5 дней и более с помощью MYSQL - PullRequest
0 голосов
/ 17 октября 2018

Пытаюсь определить список сотрудников, которые постоянно отсутствуют> = 5 дней или = 3 дня, исключая выходные.

Моя таблица отсутствий в базе данных SQL выглядит следующим образом:

EMPLOYEE_ID HOURS_ABSENT    DATE
x1  7.500000    2017-01-16 00:00:00.000
x1  7.500000    2017-01-30 00:00:00.000
x1  7.500000    2017-01-31 00:00:00.000
x1  7.500000    2017-02-01 00:00:00.000
x1  7.500000    2017-02-02 00:00:00.000
x1  7.500000    2017-02-03 00:00:00.000
x1  7.500000    2017-02-06 00:00:00.000
x1  7.500000    2017-02-07 00:00:00.000
x1  7.500000    2017-05-22 00:00:00.000
X2  7.500000    2016-11-29 00:00:00.000
X2  7.500000    2016-11-30 00:00:00.000
X2  7.500000    2016-12-01 00:00:00.000

Ищу результаты, аналогичные приведенным ниже.

EMPLOYEE_ID HOURS_ABSENT    DATE    3DAYS   5DAYS
x1  7.500000    2017-01-16 00:00:00.000 0   0
x1  7.500000    2017-01-30 00:00:00.000 0   1
x1  7.500000    2017-01-31 00:00:00.000 0   0
x1  7.500000    2017-02-01 00:00:00.000 0   0
x1  7.500000    2017-02-02 00:00:00.000 0   0
x1  7.500000    2017-02-03 00:00:00.000 0   0
x1  7.500000    2017-02-06 00:00:00.000 0   0
x1  7.500000    2017-02-07 00:00:00.000 0   0
x1  7.500000    2017-05-22 00:00:00.000 0   0
X2  7.500000    2016-11-29 00:00:00.000 1   0
X2  7.500000    2016-11-30 00:00:00.000 0   0
X2  7.500000    2016-12-01 00:00:00.000 0   0

Для флагов 3DAYS и 5DAYS следует установить значение 1в день начала на основе условия.

Любая помощь будет оценена

1 Ответ

0 голосов
/ 17 октября 2018

Вот что-то похожее ...

DROP TABLE IF EXISTS absentees;

CREATE TABLE absentees
(employee_id INT NOT NULL
,date DATE NOT NULL
,PRIMARY KEY(employee_id,date)
);

INSERT INTO absentees VALUES
(1,'2017-01-16'),
(1  ,'2017-01-30'),
(1  ,'2017-01-31'),
(1  ,'2017-02-01'),
(1  ,'2017-02-02'),
(1  ,'2017-02-03'),
(1  ,'2017-02-06'),
(1  ,'2017-02-07'),
(1  ,'2017-05-22'),
(2  ,'2016-11-29'),
(2  ,'2016-11-30'),
(2  ,'2016-12-01'); 

SELECT employee_id
     , MIN(date) date
     , MAX(i) days
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev_employee_id = employee_id THEN CASE WHEN @prev_date = date - INTERVAL 1 DAY THEN @i:=@i+1 ELSE @i:=1 END ELSE @i:=1 END i
            , CASE WHEN @prev_employee_id = employee_id THEN CASE WHEN @prev_date = date - INTERVAL 1 DAY THEN @j:=@j ELSE @j:=@j+1 END ELSE @j:=1 END j
            , @prev_employee_id := employee_id prev_employee_id
            , @prev_date := date prev_date
         FROM absentees x
         JOIN (SELECT @prev_employee_id :='',@prev_date:='',@i:=0,@j:=0) vars
        ORDER
           BY employee_id
            , date
     ) a
 GROUP
    BY employee_id
     , j
HAVING days >= 3;

+-------------+------------+------+
| employee_id | date       | days |
+-------------+------------+------+
|           1 | 2017-01-30 |    5 |
|           2 | 2016-11-29 |    3 |
+-------------+------------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...