类似有一个表
字段如下:
name(销售名) b(int,类似销售金额) time(datetime,时间戳)
需要的查询结果
name total(销售总额,当天所以 B 字段加起来的和) 日期( yy-MM-dd )
各位有什么资料连接,或者提示的? 给个文章自己研究,目前百度下几个方案好像不是很好。
1 jorneyr 2019-06-21 12:00:10 +08:00 可以参考一下: select date(created_at), count(1) from user group by date(created_at) |
![]() | 2 Maboroshii 2019-06-21 12:08:27 +08:00 select from_unixtime(time, '%Y-%m-%d) as date, name, sum(b) from t group by date, name, order by date |
![]() | 3 Mac 2019-06-21 14:55:21 +08:00 via Android group by |
4 Raymon111111 2019-06-21 14:58:21 +08:00 插入的时候实时计算, 扔到缓存里 然后每天再把缓存里的数落地 容错性强一点可以每小时或者半小时搞一次, 要是挂了只用再 count 当前小时的数据即可 强行用 sql 去搞这个不是给自己制造麻烦吗 |
5 neoblackcap 2019-06-21 14:59:10 +08:00 一般的做法都是另外建一张汇总表,第二天统计昨天的结果,将结果汇总。 这个汇总的过程就不限于 SQL,你写一个定时程序就可以了 |
6 wqzjk393 2019-06-21 15:07:50 +08:00 先套一层子查询,把时间戳转成你要的那个 yymmdd 格式,然后 select name,sum(b),time_format from 子查询 group by(name,time_format) |
![]() | 7 cpdyj0 2019-06-21 15:14:58 +08:00 用 SQL 搞可能会降低性能哦 |
8 zarte 2019-06-21 15:35:54 +08:00 select sum ( b ) as total,name where time< and time>= group by name |
9 KigKrazy OP 谢谢大家的回复 @!!!! 另外问下大家都是怎么做的,我在创建比如订单的时候加上一个日期可以吗? 大家生产环境都是怎么个操作手法呢 |
![]() | 10 Beeethoven 2019-06-21 15:44:55 +08:00 要是我的话 新建一张表 然后在服务器跑段定时代码,每天固定时间统计 timestamp 在今天内的所有行,运算完毕后存到新表里。只用 SQL 不仅麻烦而且脱离实际啊 |
11 KigKrazy OP |
![]() | 13 Ritr 2019-06-21 15:51:12 +08:00 @neoblackcap 嗯说的对,定时汇总到一张汇总表里即可。简单有效查询还快 |
![]() | 14 Ritr 2019-06-21 15:53:22 +08:00 @KigKrazy 要看实时数据,可以结合汇总表的数据+当前数据进行计算。比如汇总表的数据是 2019-6-1 到 2019-6-20 的数据,而 2019-6-21 的数据重新查出来即可。 |
16 zisway 2019-06-21 16:00:45 +08:00 历史统计数据加今日统计数据,定时任务统计好历史数据就可以了 |
17 l1203 2019-06-21 16:17:07 +08:00 只有 sqlserver 的实现,我创建了一个数据库试了下,能按要求查出来。 select Name,SUM(Money) as Total,CONVERT(VARCHAR(10),CreateTime,120) AS Dates from Test group by Name,CONVERT(VARCHAR(10),CreateTime,120) |
18 ahjiangwu 2019-06-21 16:25:19 +08:00 #17 楼的方法可行 只是对于数据量的情况,几乎很难实现 #4 楼给了分治的方法可以参考 我遇到的情况用的与 #5 类似的方法,只是把数据拆的更细,冗余了日期和小时字段 |
19 neoblackcap 2019-06-21 16:49:58 +08:00 不说数据量,单单最求实时是不现实的。你一秒几十个订单,你的实时也不准啊。 你每分钟读从库汇总一次,实时性也不差啊。 如果要真正既实时又准确,怕是需要大改造你们现有的系统。所以这样的需求,用最简单的方法解决就可以了。 单独的一个定时任务,谁来维护都很容易,出错的可能性也不大。 |
20 Raymon111111 2019-06-21 16:55:09 +08:00 |
21 dyllen 2019-06-21 17:35:14 +08:00 统计这种需求,一般是定时计算,查看的都是预先计算好的数据。 如果是实时去查下统计,性能是个问题。 |
22 dyllen 2019-06-21 17:36:51 +08:00 按天,可以第二天统计前一天的数据;按周,可以每周一统计上一周的数据;按月,可以每月 1 号统计上个月的数据。这样类推。 |
![]() | 23 wysnylc 2019-06-21 18:06:05 +08:00 两种方案 定时统计和新增+1,前者每天统计当前的数据总额新增到汇总表中 后者在每次新增数据会进行+1 可以实时读取 |
![]() | 25 akira 2019-06-21 19:42:15 +08:00 select xxx group by,就是个分组统计。等到你们出现性能问题的时候 再针对性处理就好 |
![]() | 26 zjyl1994 2019-06-22 12:26:18 +08:00 SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'yyyy-MM-dd') AS date_char FROM table GROUP BY name,datechar 可能是你想要的效果? |
![]() | 27 zjyl1994 2019-06-22 12:29:15 +08:00 我错了,按天的应该这样的 SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'%Y-%m-%d') AS date_char FROM table GROUP BY name,datechar 如果周的话 SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'%Y(%u)') AS date_char FROM table GROUP BY name,datechar 月的话 SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'%Y-%m') AS date_char FROM table GROUP BY name,datechar 最近在做报表类的,这 sql 也是我司大佬教我的 |