Заполнение дат начала и окончания недели на основе последовательных недель в данных

Сотрудник Дата окончания выходных Производная дата окончания недели начала Производная дата окончания недели Джон 03.02.2024 03.02.2024 17.02.2024 Джон 10.02.2024 03.02.2024 17.02.2024 Джон 17.02.2024 03.02.2024 17.02.2024 Джон 02.03.2024 02.03.2024 16.03.2024 Джон 09.03.2024 02.03.2024 16.03.2024 Джон 16.03.2024 02.03.2024 16.03.2024

Из приведенной выше таблицы мне нужно с помощью SQL вывести:

  • Производная дата окончания недели начала
  • Производная дата окончания недели

Для каждого конкретного сотрудника необходимо проверить даты окончания выходных для последовательных недель, а затем, соответственно, объединить их вместе, заполнив производную дату окончания недели начала и дату окончания выходного дня.

Первые 3 строки объединяются вместе, поскольку даты окончания выходных идут подряд, а затем имеется перерыв более чем на 1 неделю. Поэтому последние 3 строки группируются вместе. Когда строки объединены в клубы, min week end date становится производной датой начала недели, а max week end date становится производной датой окончания недели.

Я пробовал оконные функции.

Похоже на проблему пробелов и островов SQL.

Bart McEndree 04.04.2024 19:18

Что значит сбились вместе? Пожалуйста, покажите нам свою попытку функции окна.

Dale K 04.04.2024 19:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя предложения из Острова нумерации в 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

рабочий пример

cte fiddle

Сотрудник Дата окончания недели Дериведстартнеделяконецдата ПроизводныйEndWeekEndDate Джон 03.02.2024 03.02.2024 2024-02-17 Джон 2024-02-10 03.02.2024 2024-02-17 Джон 2024-02-17 03.02.2024 2024-02-17 Джон 2024-03-02 2024-03-02 2024-03-16 Джон 09.03.2024 2024-03-02 2024-03-16 Джон 2024-03-16 2024-03-02 2024-03-16

Другие вопросы по теме