SQL- отслеживание дат отпуска сотрудников

#sql

#sql

Вопрос:

 Emp id start date end date 
1. 1/14/18. 1/4/18 
1. 1/8/18. 1/8/18 
1. 1/11/18. 1/11/18 
1. 1/12/18. 1/12/18 
1. 1/13/18. 1/13/18 
1. 1/14/18. 1/14/18 
1. 1/15/18. 1/15/18 
1. 1/16/18. 1/16/18 
2. 1/1/18 1/13/18
  

Мне нужно, чтобы, если сотрудник № 1 продолжает работу из приведенной выше таблицы более 5 дней, мне нужно получать оповещения. Таким образом, от строки 3 до 8 должно учитываться. Первые две строки не должны учитываться. Пожалуйста, помогите в sql. Возможно, вы думаете о создании цикла.

Комментарии:

1. Пожалуйста, укажите базу данных, которую вы используете.

2. Как вы определяете порядок таких данных? Порядок в таблицах не гарантирован, так как я узнаю, что emp_ID 1 в 14.1.18 не будет использоваться позже?

3. я не определял. таким образом, таблица отпусков сотрудников настраивается как

Ответ №1:

Вы можете определить группы смежных дат путем вычитания порядкового номера. Точный синтаксис зависит от базы данных, но что-то вроде этого.

Затем вы можете рассчитывать внутри группы:

 select t.*,
       count(*) over (partition by emp_id, grp) as cnt
from (select t.*, 
             (start_date -
              row_number() over (partition by emp_id order by start_date) * interval '1 day'
             ) as grp
      from t
     ) t;
  

Вы можете использовать это как подзапрос и добавить предложение where, например where cnt >= 5 , чтобы получить строки.

Ответ №2:

Спасибо, Гордон. это сработало, но теперь я хочу поместить этот запрос в цикл с помощью курсора, чтобы он считывал каждую запись по идентификатору сотрудника. я поставил, но те же 6 записей повторяются. я думаю, что что-то не так с циклом, который я должен был объявить:

 DECLARE @emp as varchar(20);
Declare @start as Date;
Declare @end as Date;
--Declare @date as Date;
DECLARE pstar2 CURSOR FOR
SELECT ApproveTime.[Employee ID],ApproveTime.[Start Date],ApproveTime.[End Date] 
from ApproveTime 
--where ApproveTime.[Employee ID]='JUF0036419' and
--ApproveTime.[Start Date]=ApproveTime.[End Date] 
--ApproveTime.[Employee ID]='36419'

open pstar2
--while loop
--EXIT when c1%NOTFOUND;
 FETCH next from pstar2 into @emp, @start, @end
 while (@@FETCH_STATUS=0)
 begin
select 
       count(*) over (partition by ApproveTime.[Employee ID], grp) as cnt, *
from (select t.*, 
             (t.[Start Date] -
              row_number() over (partition by t.[Employee ID] order by t.[Start Date]) * 1
             ) as grp
      from approvetime t
     ) approvetime where ApproveTime.[Employee ID]='36419'
     and  (ApproveTime.[Start Date] >='2018-01-01 00:00:00.000' and ApproveTime.[End Date]<='2018-01-31 00:00:00.000')
 print @emp 
 print @start
 print @end

 end
 --end
close pstar2
DEALLOCATE pstar2
  

Ответ №3:

Спасибо, Гордон. это сработало, но теперь я хочу поместить этот запрос в цикл с помощью курсора, чтобы он считывал каждую запись по идентификатору сотрудника. я поставил, но те же 6 записей повторяются. я думаю, что что-то не так с циклом, который я должен был объявить:

 DECLARE @emp as varchar(20);
Declare @start as Date;
Declare @end as Date;
--Declare @date as Date;
DECLARE pstar2 CURSOR FOR
SELECT ApproveTime.[Employee ID],ApproveTime.[Start Date],ApproveTime.[End Date] 
from ApproveTime 
--where ApproveTime.[Employee ID]='JUF0036419' and
--ApproveTime.[Start Date]=ApproveTime.[End Date] 
--ApproveTime.[Employee ID]='36419'

open pstar2
--while loop
--EXIT when c1%NOTFOUND;
 FETCH next from pstar2 into @emp, @start, @end
 while (@@FETCH_STATUS=0)
 begin
select 
       count(*) over (partition by ApproveTime.[Employee ID], grp) as cnt, *
from (select t.*, 
             (t.[Start Date] -
              row_number() over (partition by t.[Employee ID] order by t.[Start Date]) * 1
             ) as grp
      from approvetime t
     ) approvetime where ApproveTime.[Employee ID]='36419'
     and  (ApproveTime.[Start Date] >='2018-01-01 00:00:00.000' and ApproveTime.[End Date]<='2018-01-31 00:00:00.000')
 print @emp 
 print @start`enter code here`
 print @end

 end
 --end
close pstar2
DEALLOCATE pstar2