mysql汇总一周每日新增数及累计数

背景

疫情期间需要统计每日新增确诊人数以及累计确诊人数,只查询连续一周数据。

测试表结构与数据

新建一张确诊人员信息表,记录确诊人员姓名以及确诊日期。
在这里插入图片描述

初步思路

要统计每日新增人数,首先想到根据日期分组。

SELECT
	count( 1 ) daily_new,
	time 
FROM
	confirmed_population 
GROUP BY
	time;

按日期分组获取每日新增人数
按日期分组后的结果并不是连续的,由于我们需要连续一周的数据,需要关联下固定的日期。
比如我们需要查询下从2020-03-13开始过去一周日期。

SELECT
	DATE( DATE_SUB( '2020-03-13', INTERVAL @s := @s + 1 DAY ) ) AS `date` 
FROM
	mysql.help_topic,
	( SELECT @s := - 1 ) temp 
WHERE
	@s < 7 
ORDER BY
	`date`;

固定日期
这里的开始日期和天数都可以作为参数修改。

一周每日新增数

有了上述的基础准备我们已经可以查询连续一周的每日新增数。

SELECT
	base.date,
	ifnull( daily_new, 0 ) daily_new 
FROM
	(
	SELECT
		DATE( DATE_SUB( '2020-03-13', INTERVAL @s := @s + 1 DAY ) ) AS `date` 
	FROM
		mysql.help_topic,
		( SELECT @s := - 1 ) temp 
	WHERE
		@s < 7 
	ORDER BY
		`date` 
	) base
	LEFT JOIN ( SELECT count( 1 ) daily_new, time FROM confirmed_population GROUP BY time ) res ON base.date = res.time 
ORDER BY
	base.date;

一周每日新增数

通过每日新增数计算累计数

现在就到了最关键的一步,将每日新增数汇总成累计值。
这里需要使用到mysql的自定义变量,与上面查询日期时一样通过’@变量名’使用。

SELECT
	date,
	daily_new,
	@total := @total + daily_new AS total 
FROM
	(
	...
	) AS temp,
	( SELECT @total := 0 ) tab1;

累计值
为了看起来更清晰使用省略号代替查询一周每日新增数部分。

优化

到上一步基本就满足了查询要求,但是还有一个问题:
累计数是从0开始累计的,所以我们还需要计算下基础累计值。

SELECT
	@total := count( 1 ) 
FROM
	confirmed_population 
WHERE
	time < date_add( '2020-03-13', INTERVAL - 7 DAY )

最后合并完成的完整sql如下:

SELECT
	date,
	daily_new,
	@total := @total + daily_new AS total 
FROM
	(
	SELECT
		base.date,
		ifnull( daily_new, 0 ) daily_new 
	FROM
		(
		SELECT
			DATE( DATE_SUB( '2020-03-13', INTERVAL @s := @s + 1 DAY ) ) AS `date` 
		FROM
			mysql.help_topic,
			( SELECT @s := - 1 ) temp 
		WHERE
			@s < 7 
		ORDER BY
			`date` 
		) base
		LEFT JOIN ( SELECT count( 1 ) daily_new, time FROM confirmed_population GROUP BY time ) res ON base.date = res.time 
	ORDER BY
		base.date 
	) AS temp,
	( SELECT @total := count( 1 ) FROM confirmed_population WHERE time < date_add( '2020-03-13', INTERVAL - 7 DAY ) ) tab1;

最终版

后记

sql写完后写到代码中查询时会报错(使用的mybatis)

MybatisPlusException: Failed to process, please exclude the tableName or statementId.

百度了下报错原因是因为项目使用了多租户,解析sql时会追加例如tenant_id等条件。
在接口上增加注解即可解决。

@SqlParser(filter = true)

在这里插入图片描述

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值