您的位置:首页 > 数据库

数据补全 小时 近七天 ${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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐