Есть ли способ рекурсивно запросить столбец даты с диапазоном дат?

#mysql #sql #recursive-query

Вопрос:

У меня есть строки, как показано ниже, со столбцом даты и именем пользователя

 visit_date | user_name
2021-01-01, a
2021-01-02, a
2021-01-03, a
2021-01-04, a
2021-01-04, a
2021-01-01, b
 

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

 visit_date_from | visit_date_to | user_name | count
2021-01-01, 2021-01-01, a, 1
2021-01-01, 2021-01-02, a, 2
2021-01-02, 2021-01-02, a, 1
2021-01-01, 2021-01-03, a, 3
2021-01-02, 2021-01-03, a, 2
2021-01-03, 2021-01-03, a, 1
2021-01-01, 2021-01-04, a, 5
2021-01-02, 2021-01-04, a, 4
2021-01-03, 2021-01-04, a, 3
2021-01-04, 2021-01-04, a, 2
2021-01-01, 2021-01-05, a, 4
.
.
.
.
 

Есть ли способ задать такой вопрос?

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

1. Вы хотите, чтобы это было для конкретного пользователя? Определенный диапазон дат?

2. @ysth Я хочу, чтобы это было для определенного диапазона дат, таких как объявление from_date = ‘2021-01-01’ и to_date = ‘2021-01-05’

Ответ №1:

Основное использование рекурсивного запроса

 create table t0812 as 
select date_format('2021-01-01', '%Y-%m-%d') dat, 'a' nam union all
select date_format('2021-01-02', '%Y-%m-%d') dat, 'a' nam union all
select date_format('2021-01-03', '%Y-%m-%d') dat, 'a' nam union all
select date_format('2021-01-04', '%Y-%m-%d') dat, 'a' nam union all
select date_format('2021-01-01', '%Y-%m-%d') dat, 'b' nam
;

with recursive rec(dat, to_dat, nam) as (
select dat, dat, nam from t0812 t0 
union all
select t1.dat,t2.dat, t1.nam 
  from rec t1, 
       t0812 t2 
 where t1.nam = t2.nam 
   and date_add(t1.to_dat, interval 1 day) = t2.dat
)
select * from rec t1
 order by t1.nam, t1.to_dat, t1.dat
;