#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