现有一个表EQP_TRANS_ODS
会记录机台状态,
机况种类:IDLE/DOWN/RUN,
有Start_time,END_TIME,KEEP_TIME;
但是这个表有个问题,每天07:30,会自动截断重新生成一行数据,
例如机况Run时间为Start_time:6:00至End_time:9:00,
到7:30截断,会显示两行,
显示为
Run 6:00-7:30 keep_time:1.5 hr,
Run 7:30-9:00 keep_time:1.5 hr ,怎么通过SQL语法将两行字段,拼接为一行 6:00-9:00 keep_time:3 hr
比如当前测试表数据如下:
查询效果如下:
对应测试DDL语句:
CREATE TABLE `eqp_trans_ods` (
`id` int(11) DEFAULT NULL,
`type` varchar(24) DEFAULT NULL,
`Start_time` time DEFAULT NULL,
`END_TIME` time DEFAULT NULL,
`KEEP_TIME` float(2,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对应测试DML语句:
-- ----------------------------
-- Records of eqp_trans_ods
-- ----------------------------
INSERT INTO `eqp_trans_ods` VALUES (1, 'IDLE', '06:00:00', '07:30:00', 1.5);
INSERT INTO `eqp_trans_ods` VALUES (2, 'IDLE', '07:30:00', '09:00:00', 1.5);
INSERT INTO `eqp_trans_ods` VALUES (3, 'DOWN', '05:00:00', '07:30:00', 2.5);
INSERT INTO `eqp_trans_ods` VALUES (4, 'DOWN', '07:30:00', '09:00:00', 1.5);
INSERT INTO `eqp_trans_ods` VALUES (5, 'RUN', '08:00:00', '10:30:00', 2.5);
INSERT INTO `eqp_trans_ods` VALUES (6, 'RUN', '10:30:00', '14:30:00', 4.0);
效果执行语句:
SELECT
a.type,
-- min( a.Start_time ) Start_time,
date_format(min(Start_time),'%H:%i') Start_time, -- 取值开始时间 最小值
-- 显示小时和分钟 -- 格式显示日期/时间数据参考:https://www.w3school.com.cn/sql/func_date_format.asp
-- max( a.END_TIME ) END_TIME,
date_format(max(END_TIME),'%H:%i') END_TIME, -- 取值最大时间 结束时间
sum( a.KEEP_TIME ) KEEP_TIME , -- 求和累计
concat(type,' ',date_format(min(Start_time),'%H:%i'),'-',date_format(max(END_TIME),'%H:%i'),' keep_time',':',sum( a.KEEP_TIME ),' hr') printResult -- 拼接结果
FROM
EQP_TRANS_ODS a
GROUP BY
a.type
ORDER BY
a.type DESC;