#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 также протестируйте альтернативный вариант.