最近的一个小项目,公司需要将自己的服务数据,通过接口提供数据给合作公司.其中有一个是需要统计每5秒的时间区间数据的分布情况,需求是这样的: 需要统计 1-5秒、5-10秒、15-20秒…...,以及平均值,平均值就这里不提了,主要记录下这个按时段统计的.
当时看见这个需求后第一时间想的是用sql 直接 case when搞,仔细想想,根本不是那么回事.case when适用于已知的、固定的纬度计算..后来用了 etl + interval 搞定.
用法可以参考这里 http://blog.itpub.net/13379967/viewspace-715701/
接下来就是需要动态去生成需要统计的区间范围的参数,以及表示区间范围对应的字段名称.
上代码(后台Java):
1.从数据库拿到需要统计数据的最长时间,用最长时间先取模,根据取模就能计算出需要分为几个区间段.
2.已知间隔值,然后和计算出的区间段个数去拼接成sql所需的区间范围参数.相同的,动态拼接区间范围的表示字段.(都作用于后面的sql注入)
// 获取最长等待时间
List<Integer> waitTimeList = callLogService.getMaxNotConnectedWaitTime(requestVO.getSearchDate(), requestVO.getTerminalType());
if (waitTimeList.size() > 0) {
// 以下4行是计算平均时长,可忽略
int timesSum = 0;
for(Integer times : waitTimeList){
timesSum += times;
}