如何统计分表(按日期分表)的总和数据

2 篇文章 0 订阅

今天遇到一个爬虫业务,爬虫每天会定期爬取百度的数据,然后放到一个分表里面,每天爬取到的数据大概有3~4百万的级别。分表的后缀名就是当天的日期,
比如table_name_20170215,table_name_20170216
其中有一个功能,需要我每隔30s去查询爬取数据的总数,原本是极为简单的操作,直接调用count函数统计一下数据就行了,但是我们的数据分布到多张表里面
这个时候就有点蛋疼了。表有多少张,我们是不清楚的,它随着日期的推进而增加。如何确定的情况下,我们可以使用sum,count函数结合union all来查询数据的总和。
比如:
select sum(tmpCount) from
(select count() as tmpCount from table_20170215 union all select count() as tmpCount from table_20170216) as a

解决的思路就是以某一天为基准,比如说2017-02-15这一天开始执行的任务,我们在2017-02-19这一天执行统计,这个时候我们需要计算出开始的那一天
到2017-02-19一共的天数,通过程序的判断拼接成相应的SQL语句,这样就可以解决问题了,下面给出了mybatis的例子:

<select id="countCurrentCompletedAggs" parameterType="java.util.List" resultType="java.lang.Long">
     SELECT SUM(tmpCount) FROM (
     <foreach collection="tableNames" item="tableName" index="index">
         <choose>
             <when test="index == 0">
                 SELECT COUNT(*) as tmpCount FROM ${tableName}
             </when>
             <otherwise>
                 UNION ALL
                 SELECT COUNT(*) as tmpCount FROM ${tableName}
             </otherwise>
         </choose>
     </foreach>
     ) as agg
 </select>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值