数据补全 小时 近七天 ${unionSql} 不加order by自动按 order by的字段升序排列
2018-02-11 20:51
369 查看
这里小时补全数据是list<String>时间大于2 补全中间间隔的时间,而近七日的补全是讲七日的返回,不会返回null
group by 字段 不加order by自动按 order by的字段升序排列 最好是加上order by date
sql注意之 去掉09:00前面的0 select (CASE WHEN LEFT(aa.date, 1)='0' TH EN RIGHT(aa.date, 4) ELSE aa.date end) as date
//这里使用%k如果补齐成09:00不带前面的0,则group by order by date排序就会出现问题,9:00会在10:00的后面 -- 如果库里没有,都可以用这个方法进行补全 因为后面是用了group by日期 就近展示前面的数据,比如前面有9点的数据,就不用后面UNION (SELECT '09:00', 0)的9点的0数据了,所以就不用 SUM(aa.customerPersonTimes)了, 妥了!至于sql中间那一长串的UNION语句,那就根据选择的日期用java生成吧
/** * (除date外1列补0) 输入09:00(注意前面的0要带上) 和 18:00 获取start end 小时间隔 * UNION (SELECT '09:00', 0) UNION (SELECT '10:00', 0) * * @param start 4000 * @param end * @param columNum * @return */ public static String getHourUnionString(String start, String end, int columNum) { StringBuilder stringBuilder = new StringBuilder("', "); for (int i = 0; i < columNum; i++) { if (i == columNum - 1) { stringBuilder.append(" 0)"); break; } stringBuilder.append("0, "); } StringBuilder sb = new StringBuilder(); int startNum = Integer.valueOf(start.substring(0, 2)); int endNum = Integer.valueOf(end.substring(0, 2)); int i = endNum - startNum; for (int j = 0; j <= i; j++) { String s; if (startNum < 10){ s = "0" + String.valueOf(startNum) + ":00"; }else { s = String.valueOf(startNum) + ":00"; } sb.append("UNION (SELECT '" + s + stringBuilder.toString()); startNum += 1; } return sb.toString(); } /** * (除date外两列补0,columNum=2)获取近num天间隔 * UNION (SELECT '2019-01-25', 0, 0) UNION (SELECT '2019-01-26', 0, 0) * * @param date * @param num * @param columNum * @return */ public static String getWeekListUnionString(String date, int num, int columNum) { StringBuilder stringBuilder = new StringBuilder("', "); for (int i = 0; i < columNum; i++) { if (i == columNum - 1) { stringBuilder.append(" 0)"); break; } stringBuilder.append("0, "); } DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); StringBuilder sb = new StringBuilder("UNION (SELECT '" + date + stringBuilder.toString()); try { Date d = sdf.parse(date); for (int i = 0; i < num -1; i++) { Calendar instance = Calendar.getInstance(); instance.setTime(d); instance.add(Calendar.DAY_OF_YEAR, -1); Date nextDate = instance.getTime(); String s = sdf.format(nextDate); d = sdf.parse(s); sb.append(" UNION (SELECT '" + s + stringBuilder.toString()); } } catch (ParseException e) { e.printStackTrace(); } return sb.toString(); }@Override
public AccuratePassengerFlowAnalysis getCustomerSevenDistribution(HashMap<String, Object> parmMap) {
String dataTime = parmMap.get("dataTime").toString();
String stringBuilder = DateUtil.getWeekListUnionString(dataTime , 7, 2);
parmMap.put("unionSql", stringBuilder);
AccuratePassengerFlowAnalysis obj = accuratePassengerFlowAnalysisMapper.getCustomerSevenDistribution(parmMap);
return obj;
}
@Override
public AccuratePassengerFlowAnalysis getCustomerPeriodTrend(HashMap<String, Object> parmMap) {
List<String> list = accuratePassengerFlowAnalysisMapper.getHourList(parmMap);//查询时间的list
if (list.size()>= 2) { //大于2补全间断数据
parmMap.put("unionSql", DateUtil.getHourUnionString(list.get(0), list.get(list.size() -1), 1));
}
return accuratePassengerFlowAnalysisMapper.getCustomerPeriodTrend(parmMap);
}
<!--顾客近7日分布--> <select id="getCustomerSevenDistribution" resultType="com.winner.model.AccuratePassengerFlowAnalysis" parameterType="Map"> SELECT CONCAT('[',GROUP_CONCAT(CONCAT("'",bb.dataTime,"'")),']') AS dataTimeList, CONCAT('[',GROUP_CONCAT(CONCAT("'",bb.customerPersonTimes,"'")),']') AS customerPersonTimesList, CONCAT('[',GROUP_CONCAT(CONCAT("'",bb.customerNum,"'")),']') AS customerNumList FROM (SELECT dataTime, customerPersonTimes, customerNum FROM ( SELECT dataTime, customerPersonTimes, customerNum FROM ft_report_site_day WHERE siteKey = #{siteKey} AND dataTime BETWEEN DATE_SUB(#{dataTime}, INTERVAL 6 DAY) AND #{dataTime} ${unionSql} ) aa GROUP BY aa.dataTime order by aa.dataTime ) bb </select> <!--顾客时段趋势 给小时加1(14:05都算入到15:00里)--> <select id="getCustomerPeriodTrend" resultType="com.winner.model.AccuratePassengerFlowAnalysis" parameterType="Map"> SELECT CONCAT('[',GROUP_CONCAT(CONCAT("'",bb.date,"'")),']') AS date, CONCAT('[',GROUP_CONCAT("'",bb.customerPersonTimes,"'"),']') AS value FROM ( SELECT (CASE WHEN LEFT(aa.date, 1)='0' THEN RIGHT(aa.date, 4) ELSE aa.date end) as date, aa.customerPersonTimes FROM ( SELECT (CASE WHEN date='00:00' then '01:00' WHEN date='01:00' THEN '02:00' WHEN date='02:00' THEN '03:00' WHEN date='03:00' THEN '04:00' WHEN date='04:00' THEN '05:00' WHEN date='05:00' THEN '06:00' WHEN date='06:00' THEN '07:00' WHEN date='07:00' THEN '08:00' WHEN date='08:00' THEN '09:00' WHEN date='09:00' THEN '10:00' WHEN date='10:00' THEN '11:00' WHEN date='11:00' THEN '12:00' WHEN date='12:00' THEN '13:00' WHEN date='13:00' THEN '14:00' WHEN date='14:00' THEN '15:00' WHEN date='15:00' THEN '16:00' WHEN date='16:00' THEN '17:00' WHEN date='17:00' THEN '18:00' WHEN date='18:00' THEN '19:00' WHEN date='19:00' THEN '20:00' WHEN date='20:00' THEN '21:00' WHEN date='21:00' THEN '22:00' WHEN date='22:00' THEN '23:00' ELSE '24:00' END) AS date, customerPersonTimes FROM (SELECT DATE_FORMAT(fbd.dataTime, '%H:00') AS date, COUNT(fbd.personId) AS customerPersonTimes FROM ft_base_data fbd INNER JOIN ft_site_camera_map fscm ON fbd.cameraKey = fscm.cameraKey AND fscm.siteKey = #{siteKey} LEFT JOIN ft_clerk fct a110 ON fbd.personId = fct.personId AND fct.siteKey = #{siteKey} WHERE fbd.dataTime BETWEEN #{dataTime} AND #{dataTimeEnd} AND fct.personId IS NULL GROUP BY DATE_FORMAT(fbd.dataTime, '%H') ${unionSql} ) cc ) aa GROUP BY aa.date order by aa.date ) bb </select>
相关文章推荐
- SQL-ORDER BY 多字段排序(升序、降序)
- SQL-ORDER BY 多字段排序(升序、降序)
- 【Excle数据透视】如何升序排列字段列表中的字段
- SQL-ORDER BY 多字段排序(升序、降序)
- SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序? group by 语句执行后记录会按关键字自动升序吗?
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- SQL 对于有N多字段的表,踢出不需要的字段,自动频出剩余字段的SQL语句
- 添加自动job来分析数据表提高SQL执行效率
- sql中删除冗余数据和一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在对列出所有组合等sql面试题
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- 已知顺序表L1,L2中数据由小到大有序,请用尽可能快的方法将L1与L2中的数据合并到L3中,使数据在L3中按升序排列
- row_number()over(order by id) SQL顺序排列
- SQL中将某个表中的多行数据在一个字段显示
- sqlserver/oracle当插入表数据时同时修改其中一个字段的触发器
- SQL2005中设置自动编号字段
- Java.sql.Types,数据库字段类型,java数据类型的对应关系
- 以数据库字段分组显示数据的sql语句
- oracle 字段递增 表插入数据,id自动增1
- Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
- 麻烦问一下单字段按查询结果精度返回结果,思路怎么做(除sql 的union合并)