有一张表,有两个关键字段,一个日期字段,一个文字描述字段
想获取文字描述字段对应时间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))
FROM
表
GROUP 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函数对满足条件的记录进行计数,最后按日期降序排序。
仅供参考,望采纳,谢谢。
create table record_detail
(
record_date date,
word_desc varchar(10)
);
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');
主表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