目录
前言
步骤1:date_format函数
步骤2:concat函数
步骤3、4:查询中使用变量
完整代码
前言
在数采数据已写入mysql数据库中后,进行数据处理,统计电量与耗料数据
由于数据库版本较低,无法使用较新的函数
需要做的操作:
1、查询增加列:采集日期(去除具体的时分秒)
2、查询增加列:合并不同信息(产线名称、数采点位、采集日期)
3、查询增加列:前一行数据
4、得到结果集:产线名称、数采点位、单位、采集日期、开始采集时间、结束采集时间、累计数据
基础数据:1号线、2号线、14号线为产线名称;总耗料、总电量为采集数据;总耗料和总电量是会递增的,在HMI可以进行清零操作,在超过PLC该点位最大值后,也会进行清零
源数据T1:
步骤1:date_format函数
MySQL DATE_FORMAT() 函数
DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据
语法:DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式
%Y 年,4 位
%m 月,数值(00-12)
%d 天,数值(00-31)
用 DATE_FORMAT() 函数来显示不同的格式。使用NOW()来获得当前的日期/时间:
DATE_FORMAT(NOW(),'%m-%d-%Y');
select DATE_FORMAT(NOW(),'%Y-%m-%d') now_date from dual;
步骤2:concat函数
MySQL concat () 函数
将多个字符串连接成一个字符串
concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果该函数中的任何参数为NULL,返回结果为NULL
select concat("abc","123") str from dual;
步骤3、4:查询中使用变量
当前行数据减去上一行数据:
1、定义A.V初始值为0
2、将A表查出来,将变量@A.V复制给V2,将当前值V赋值给变量@A.V
3、将V-V2
(第一行没有上一行,所以减去后的结果还是第一行的数据)
源数据
SELECT T.I,T.V,V-V2 DIFF
FROM(
SELECT A.I AS I, A.V AS V, @A.V AS V2, @A.V:= A.V
FROM
(select 11 V, 1 I from dual
union ALL
select 93 V, 2 I from dual
union ALL
select 41 V, 3 I from dual
union ALL
select 55 V, 4 I from dual
union ALL
select 17 V, 5 I from dual) A,(SELECT @A.V:=0)B
)T
完整代码
-- 步骤4
SELECT
T5.device_name, #产线名称
T5.sen_name, #数采点位
T5.sen_unit, #单位
T5.collect_date, #采集日期
min( T5.collect_time ) start_collect,#开始采集时间
max( T5.collect_time ) end_collect,#结束采集时间
round(sum(IF((T5.sen_data < T5.data_last
AND T5.device_name = T5.dev_last
AND T5.sen_name = T5.sen_last),T5.sen_data,(T5.sen_data - T5.data_last))),3) sum_data #累计数据
-- 防止清零影响数据准确性 若上一个数据大于本条数据,名称相同,点位相同,可能是因为清零的原因
FROM(
-- 步骤3
SELECT
T4.*,
@T4.sen_data AS data_last, -- 前一行数据
@T4.sen_data := T4.sen_data,
@T4.device_name AS dev_last, -- 前一行设备
@T4.device_name := T4.device_name,
@T4.sen_name AS sen_last, -- 前一行产线
@T4.sen_name := T4.sen_name
FROM
(
-- 步骤2
SELECT
T1.*,
concat( T1.device_name, T1.sen_name, T1.collect_date ) Conbine
FROM(
-- 步骤1
SELECT T1.*,
date_format( T1.collect_time, '%Y-%m-%d' ) collect_date #采集日期
FROM T1
) T1
ORDER BY
concat( T1.device_name, T1.sen_name, T1.collect_date ) ASC,
T1.collect_time ASC
) T4,
(SELECT @T4.sen_data := 0.000, @T4.device_name := NULL, @T4.sen_name := NULL ) tmp
) T5
WHERE
T5.device_name = T5.dev_last
AND T5.sen_name = T5.sen_last
GROUP BY
T5.device_name,#设备名称
T5.sen_name, #传感器名称
T5.sen_unit, #传感器单位
T5.collect_date; #数据采集日期
得到结果: