Из приведенной выше таблицы мне нужно с помощью SQL вывести:
Для каждого конкретного сотрудника необходимо проверить даты окончания выходных для последовательных недель, а затем, соответственно, объединить их вместе, заполнив производную дату окончания недели начала и дату окончания выходного дня.
Первые 3 строки объединяются вместе, поскольку даты окончания выходных идут подряд, а затем имеется перерыв более чем на 1 неделю. Поэтому последние 3 строки группируются вместе. Когда строки объединены в клубы, min week end date
становится производной датой начала недели, а max week end date
становится производной датой окончания недели.
Я пробовал оконные функции.
Что значит сбились вместе? Пожалуйста, покажите нам свою попытку функции окна.
Используя предложения из Острова нумерации в SQL Server 2012 мне удалось добавить номер группы к вашим сгруппированным вместе неделям.
CREATE TABLE Example
(
Employee VARCHAR(512),
WeekEndDate Date
);
INSERT INTO Example (Employee, WeekEndDate) VALUES
('John', '2/3/2024'),
('John', '2/10/2024'),
('John', '2/17/2024'),
('John', '3/2/2024'),
('John', '3/9/2024'),
('John', '3/16/2024');
WITH WeeksSincePreviousCalc AS
(
Select Employee,
WeekEndDate,
DATEDIFF ( week , LAG(WeekEndDate) OVER (PARTITION BY Employee ORDER BY WeekEndDate ), WeekEndDate) as WeeksSincePrevious
FROM Example
),
WeekGrouping as
(
select t.*,
sum(case WeeksSincePrevious when 1
then 0 else 1
end) over (order by Employee, WeekEndDate) as grp
from WeeksSincePreviousCalc t
),
DerivedStartEndDates as
(
Select Employee, grp, Min(WeekEndDate) as DerivedStartWeekEndDate , Max(WeekEndDate) as DerivedEndWeekEndDate
FROM WeekGrouping
GROUP BY Employee,grp
)
Select w.Employee, w.WeekEndDate, DerivedStartWeekEndDate, DerivedEndWeekEndDate
FROM WeekGrouping w
INNER JOIN
DerivedStartEndDates d on d.Employee=w.employee AND d.grp=w.grp
Похоже на проблему пробелов и островов SQL.