Вы можете использовать оконные функции. lag()
позволяет получить доступ к предыдущему day_of_work
для того же сотрудника, которого вы можете сравнить с текущим day_of_work
: если разница в один день, вы можете установить is_consecutive_work_day
в 1.
select
employee_id,
day_of_work,
case
when day_of_work
= lag(day_of_work) over(partition by employee_id order by day_of_work)
+ interval 1 day
then 1
else 0
end is_consecutive_work_day
from mytable
Чтобы вычислить накопленную сумму, это немного сложнее. Мы можем использовать некоторую технику пробелов и островов, чтобы поместить каждую запись в группу, к которой она принадлежит: в основном, каждый раз, когда встречается is_consecutive_work_day
из 0
, начинается новая группа; затем мы можем создать окно sum()
для каждой группы:
select
employee_id,
day_of_work,
is_consecutive_work_day,
sum(is_consecutive_work_day)
over(partition by employee_id, grp order by day_of_work)
consecutive_work_days
from (
select
t.*,
sum(1 - is_consecutive_work_day) over(partition by employee_id order by day_of_work) grp
from (
select
t.*,
case
when day_of_work
= lag(day_of_work) over(partition by employee_id order by day_of_work)
+ interval 1 day
then 1
else 0
end is_consecutive_work_day
from mytable t
) t
) t