#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
;