Mysql累计查询

 

DROP TABLE IF EXISTS `w_test`;

CREATE TABLE `w_test` (
  `id` int(11) DEFAULT NULL,
  `w_time` datetime DEFAULT NULL,
  `w_money` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


-- ----------------------------
-- Records of w_test
-- ----------------------------
INSERT INTO `w_test` VALUES ('1', '2017-01-01 09:40:10', '1');
INSERT INTO `w_test` VALUES ('2', '2017-02-07 11:40:31', '2');
INSERT INTO `w_test` VALUES ('3', '2017-02-14 09:40:54', '3');
INSERT INTO `w_test` VALUES ('4', '2017-03-07 11:40:31', '4');
INSERT INTO `w_test` VALUES ('5', '2017-07-17 11:40:31', '5');
INSERT INTO `w_test` VALUES ('6', '2016-04-14 11:02:47', '1');
INSERT INTO `w_test` VALUES ('7', '2017-04-14 11:02:49', '1');

 

尽量不要用标量子查询 参考mysql中使用分析函数(开窗函数)

 

及https://stackoverflow.com/questions/3333665/rank-function-in-mysql

1.每个时间点累计之前的值

select id,w_time,
	(select sum(b.w_money) from w_test b where b.w_time<=a.w_time) w_money
from w_test a ORDER BY w_time
改写如下:
select  
	a.w_time,a.w_money,
	@curVal := @curVal + a.w_money as sum_money
from w_test a,(select @curVal:=0) r  
order by a.w_time

查询结果

20W记录测试 w_test02

ALTER TABLE w_test02 ADD INDEX w_test02_nk (w_time);
select 
	max(DATE_FORMAT(w_time,'%Y-%m')),max(sum_money)
FROM(
		select    
				a.w_time,a.w_money,  
				@curVal := @curVal + a.w_money as sum_money  
		from w_test02 a,(select @curVal:=0) r    
		order by a.w_time 
		) aa
GROUP BY DATE_FORMAT(w_time,'%Y-%m')

0.5秒左右

2.按月累计

select id,DATE_FORMAT(w_time, '%Y-%m') w_time,
	(select sum(b.w_money) from w_test b where DATE_FORMAT(b.w_time, '%Y-%m')<=DATE_FORMAT(a.w_time, '%Y-%m')) w_money
from w_test a
GROUP BY DATE_FORMAT(w_time, '%Y-%m')

 

 

 

3.按月累计,缺失月份补全

 

select DATE_FORMAT(c.cal_date, '%Y-%m') cal_date,
	(select sum(b.w_money) from w_test b where DATE_FORMAT(b.w_time, '%Y-%m')<=DATE_FORMAT(a.w_time, '%Y-%m')) w_money
from w_test a
RIGHT JOIN sys_month c on(DATE_FORMAT(a.w_time, '%Y-%m')=DATE_FORMAT(c.cal_date, '%Y-%m'))
where c.cal_date>=STR_TO_DATE('2017-01','%Y-%m')
		and c.cal_date<STR_TO_DATE('2018-01','%Y-%m')
GROUP BY DATE_FORMAT(c.cal_date, '%Y-%m')

 

 

 

4.按月累计,缺失月份补全,值缺失则等于上月值

select DATE_FORMAT(c.cal_date, '%Y-%m') cal_date,	
  (select sum(b.w_money) from w_test b where DATE_FORMAT(b.w_time, '%Y-%m')<=DATE_FORMAT(c.cal_date, '%Y-%m')) w_money
from sys_month c 
where c.cal_date>=STR_TO_DATE('2017-01','%Y-%m')
	and c.cal_date<STR_TO_DATE('2018-01','%Y-%m')
GROUP BY DATE_FORMAT(c.cal_date, '%Y-%m')

 

 

日期表 

MySQL中,如果要进行分组查询并计算累计数量,可以使用窗口函数分区语句。如果你使用的是MySQL 8.0以上的版本,可以使用窗口函数sum与partition by进行组合计算。下面是一个示例查询语句: ```sql SELECT userid, date, SUM(order_count) OVER (PARTITION BY userid ORDER BY date) AS 累计 FROM order_list ``` 这个查询语句会按照userid对数据进行分组,并按照date进行排序。然后使用窗口函数SUM进行累计,通过PARTITION BY userid指定每个userid作为一个分区。最终结果会返回每个userid在每个date下的累计数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mysql的分组查询统计计算](https://blog.youkuaiyun.com/m0_67696981/article/details/130791473)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [mysql分组累计](https://blog.youkuaiyun.com/weixin_41867184/article/details/122311894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [常用mysql数据库配置文件](https://download.youkuaiyun.com/download/zslsh44/88278582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值