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

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

日期         文字描述
2022/1/9    AAA
2022/1/9    BBB
2022/1/9    CCC
2022/1/9    DDD
2022/1/8    AAA
2022/1/8    BBB
2022/1/8    CCC
2022/1/7    AAA
2022/1/7    BBB
2022/1/7    CCC
2022/1/7    DDD
2022/1/6    AAA
2022/1/6    BBB
2022/1/6    CCC
2022/1/5    AAA
2022/1/5    BBB
2022/1/5    CCC
2022/1/4    AAA
2022/1/4    BBB
2022/1/4    CCC
2022/1/3    AAA
2022/1/3    BBB

需求表:

日期    文字描述    7日内重复次数
2022/1/9    AAA    7
2022/1/9    BBB    7
2022/1/9    CCC    6
2022/1/9    DDD    2
2022/1/8    AAA    6
2022/1/8    BBB    6
2022/1/8    CCC    5
2022/1/7    AAA    5
2022/1/7    BBB    5
2022/1/7    CCC    4
2022/1/7    DDD    1
2022/1/6    AAA    4
2022/1/6    BBB    4
2022/1/6    CCC    3
2022/1/5    AAA    3
2022/1/5    BBB    3
2022/1/5    CCC    2
2022/1/4    AAA    2
2022/1/4    BBB    2
2022/1/4    CCC    1
2022/1/3    AAA    1
2022/1/3    BBB    1

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

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

SELECT t1.日期, t1.文字描述, COUNT(t2.文字描述) AS '7日内重复次数'
FROM 表 AS t1
JOIN 表 AS t2
ON t2.文字描述 = t1.文字描述 AND t2.日期 BETWEEN DATE_SUB(t1.日期, INTERVAL 7 DAY) AND t1.日期
GROUP BY t1.日期, t1.文字描述
ORDER BY t1.日期 DESC;

这条SQL语句使用了自连接的方式,将表中的记录与自身连接起来。连接条件为文字描述相同且日期在查询记录的日期的7天内,然后使用COUNT函数对满足条件的记录进行计数,最后按日期降序排序。
仅供参考,望采纳,谢谢。

一 数据准备

1.建表

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

2. 插入数据

insert into record_detail values
('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