Получение повторяющихся дат при повторении строк - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь повернуть или повторить sfhitId (1,2) между диапазоном дат для каждого сотрудника.

Все работает нормально, но я не знаю, как перестать получать повторяющиеся даты, значит почему Я получаю дублированные даты, и как мне от них избавиться ...

Может ли кто-нибудь мне с этим помочь?

Мое единственное требование - если у любого сотрудника 1 или более смены, тогда shiftId должен повторяться в указанном диапазоне дат для каждого сотрудника.

DECLARE @TempTable TABLE (EmployeeId int, ShiftId int)

INSERT INTO @TempTable
    SELECT 1 , 1
    UNION ALL
    SELECT 1, 3
    UNION ALL
    SELECT 2, 3 

DECLARE @StartDate datetime = '2020-03-05',
        @EndDate   datetime = '2020-03-09';

WITH theDates AS
(
    SELECT @StartDate AS theDate
    UNION ALL
    SELECT DATEADD(DAY, 1, theDate) 
    FROM theDates
    WHERE DATEADD(DAY, 1, theDate) <= @EndDate
)
SELECT theDate, EmployeeID, SHiftId  
FROM theDates
CROSS APPLY @TempTable
ORDER BY EmployeeId, theDate
OPTION (MAXRECURSION 0);

введите описание изображения здесь

и мне нужен такой результат ...

theDate    EmployeeID   SHiftId
2020-03-05    1          1
2020-03-06    1          3
2020-03-07    1          1
2020-03-08    1          3
2020-03-09    1          1

2020-03-05    2          3
2020-03-06    2          3
2020-03-07    2          3
2020-03-08    2          3
2020-03-09    2          3

1 Ответ

1 голос
/ 11 июля 2020

Используйте оконные функции, чтобы объединить 2 таблицы:

DECLARE @TempTable TABLE (EmployeeId int, ShiftId int)

INSERT INTO @TempTable
    SELECT 1 , 1
    UNION ALL
    SELECT 1, 3
    UNION ALL
    SELECT 2, 3 

DECLARE @StartDate datetime = '2020-03-05',
        @EndDate   datetime = '2020-03-09';

WITH 
  theDates AS (
    SELECT 1 rn, @StartDate AS theDate
    UNION ALL
    SELECT rn + 1, DATEADD(DAY, 1, theDate) 
    FROM theDates
    WHERE DATEADD(DAY, 1, theDate) <= @EndDate
  ),
  theShifts AS (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY EmployeeId ORDER BY ShiftId) rn,
      COUNT(*) OVER (PARTITION BY EmployeeId) counter
    FROM @TempTable
  )
SELECT d.theDate, s.EmployeeID, s.ShiftId  
FROM theDates d INNER JOIN theShifts s
ON s.rn % s.counter = d.rn % s.counter
ORDER BY s.EmployeeId, d.theDate
OPTION (MAXRECURSION 0);

См. демонстрацию . Результатов:

> theDate                 | EmployeeID | ShiftId
> :---------------------- | ---------: | ------:
> 2020-03-05 00:00:00.000 |          1 |       1
> 2020-03-06 00:00:00.000 |          1 |       3
> 2020-03-07 00:00:00.000 |          1 |       1
> 2020-03-08 00:00:00.000 |          1 |       3
> 2020-03-09 00:00:00.000 |          1 |       1
> 2020-03-05 00:00:00.000 |          2 |       3
> 2020-03-06 00:00:00.000 |          2 |       3
> 2020-03-07 00:00:00.000 |          2 |       3
> 2020-03-08 00:00:00.000 |          2 |       3
> 2020-03-09 00:00:00.000 |          2 |       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...