Как разделить диапазон дат на куски по 3 дня с помощью MySQL

#mysql

Вопрос:

Я пытаюсь разделить определенный диапазон дат на отрезки по 3 дня, чтобы найти количество записей на каждые три дня.

Например, предположим, что у меня есть эта таблица:

Пользователь Минимальная Дата Максимальная Дата Дни Подряд
1 09/20/2021 09/29/2021 10

И я хочу создать эту таблицу:

Пользователь Минимальная Дата Максимальная Дата
1 09/20/2021 09/22/2021
1 09/23/2021 09/25/2021
1 09/26/2021 09/28/2021

Причина, по которой я закончил там, заключается в том, что оставшихся дней недостаточно, чтобы составить 3 дня.

Комментарии:

1. Мои извинения. Я внес необходимые правки, пожалуйста, дайте мне знать, если что-то еще останется неясным.

Ответ №1:

Вам нужно что-то вроде

 WITH RECURSIVE
cte AS ( 
    SELECT User, 
           MinimumDate, 
           MinimumDate   INTERVAL 2 DAY MaximumDate,  -- N-1
           MaximumDate FinalDate
    FROM sourcetable
    WHERE MinimumDate   INTERVAL 2 DAY <= MaximumDate -- N-1
  UNION ALL
    SELECT User,
           MinimumDate   INTERVAL 3 DAY,              -- N
           MinimumDate   INTERVAL 5 DAY,              -- 2*N-1
           FinalDate
    FROM cte
    WHERE MinimumDate   INTERVAL 5 DAY <= FinalDate   -- 2*N-1
)
SELECT User,
       MinimumDate,
       MaximumDate
FROM cte
ORDER BY 1, 2;
 

или (не проверено)

 WITH RECURSIVE
cte1 AS ( SELECT (MAX(DATEDIFF(MaximumDate, MinimumDate)) DIV 3) - 1 maxrange
          FROM sourcetable ),
cte2 AS ( SELECT 0 num
          UNION ALL
          SELECT num   1 FROM cte2 WHERE num < maxrange )
SELECT User,
       MinimumDate   INTERVAL 3 * num DAY MinimumDate,
       MinimumDate   INTERVAL 2   3 * num DAY MaximumDate 
FROM sourcetable
JOIN cte2 ON MinimumDate   INTERVAL 3 * num DAY <= MaximumDate
ORDER by 1,2
 

Комментарии:

1. Однако просто короткий вопрос: если бы мы хотели, чтобы куски длились 7 дней вместо 3 дней, где бы мы изменили?

2. @TryingToLearn97 Обновлено, см. Комментарии.

3. @TryingToLearn97 также протестируйте альтернативный вариант.