mysql 查询前7天内的重复数量

有一张表,有两个关键字段,一个日期字段,一个文字描述字段
想获取文字描述字段对应时间7天内出现的重复次数,如下图样例所示:

img

尝试过想获取聚合的值,但是问题描述的where条件不知道应该如何描述了

SELECT
日期,问题描述,sum(if((recordDate between (日期 -  INTERVAL 7 DAY) and 日期) and  (问题描述 = ???),1,0))
FROMGROUP BY 日期,问题描述
ORDER BY 日期 desc

①先求出七天内aaa,bbb,ccc,ddd的次数
②用右连接七天内内的所有数据
③ 在select字句中求出你要的数据即可

一 数据准备

1.建表

create table record_detail
(
record_date date,
word_desc varchar(10)
);

2. 插入数据

insert into record_detail values('2022-01-10','AAA')
,('2022-01-02','AAA')
,('2022-01-09','AAA')
,('2022-01-09','BBB')
,('2022-01-09','CCC')
,('2022-01-09','DDD')
,('2022-01-08','AAA')
,('2022-01-08','BBB')
,('2022-01-08','CCC')
,('2022-01-07','AAA')
,('2022-01-07','BBB')
,('2022-01-07','CCC')
,('2022-01-07','DDD')
,('2022-01-06','AAA')
,('2022-01-06','BBB')
,('2022-01-06','CCC')
,('2022-01-05','AAA')
,('2022-01-05','BBB')
,('2022-01-05','CCC')
,('2022-01-04','AAA')
,('2022-01-04','BBB')
,('2022-01-04','CCC')
,('2022-01-03','AAA')
,('2022-01-03','BBB');

二 解决思路

1. 关联日期表

主表record_detail需关联一张日期表(这张日期表记录了每一个word_desc字段出现的日期)
日期表可以通过以下SQL获得

     select 
     DISTINCT  record_date
     ,word_desc
     from 
     record_detail

主表record_detail使用以下条件关联:

a.word_desc = b.word_desc and datediff(a.record_date,b.record_date) >= 0 and datediff(a.record_date,b.record_date) < 7

2. 开窗函数

ROW_NUMBER() over() : 按word_desc和record_date分组, 对日期差值倒序排序, 最后我们只需要差值最大的一个
sum(1) over () : 对符合条件的记录进行累加

3. 完整SQL

 select 
word_desc
,record_date
,total
from 
(
select 
a.word_desc
,a.record_date
,b.record_date as record_date_b
,datediff(a.record_date,b.record_date) 
,ROW_NUMBER() over (partition by a.word_desc,a.record_date order by datediff(a.record_date,b.record_date) desc ) ranking
,sum(1) over (partition by a.word_desc,a.record_date order by b.record_date desc)  total 
 from 
 record_detail a 
 join 
 (
     select 
     DISTINCT  record_date
     ,word_desc
     from 
     record_detail
 )
 b on a.word_desc = b.word_desc and datediff(a.record_date,b.record_date) >= 0 and datediff(a.record_date,b.record_date) < 7

) a
 where ranking = 1
 order by record_date desc,word_desc

img