有一张表,有两个关键字段,一个日期字段,一个文字描述字段
想获取文字描述字段对应时间7天内出现的重复次数,如下图样例所示:
尝试过想获取聚合的值,但是问题描述的where条件不知道应该如何描述了
SELECT
日期,问题描述,sum(if((recordDate between (日期 - INTERVAL 7 DAY) and 日期) and (问题描述 = ???),1,0))
FROM
表
GROUP BY 日期,问题描述
ORDER BY 日期 desc
①先求出七天内aaa,bbb,ccc,ddd的次数
②用右连接七天内内的所有数据
③ 在select字句中求出你要的数据即可
create table record_detail
(
record_date date,
word_desc varchar(10)
);
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');
主表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
ROW_NUMBER() over() : 按word_desc和record_date分组, 对日期差值倒序排序, 最后我们只需要差值最大的一个
sum(1) over () : 对符合条件的记录进行累加
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