------------------------------
-------函数入口在最后---------
------------------------------
drop table if exists remote_analyze;
create table remote_analyze(--统计表
timeBegin timestamp not null primary key ,
controlNum int default 0,
controlSuccessNum int default 0,
controlFailseNum int default 0,
controlFailseRate real default 0,
---具体功能-------------------------------
cmd_00101 INTEGER,--总数
cmd_00101_T INTEGER,--成功次数
cmd_00101_F INTEGER,--车门上锁 1
cmd_00101_falseRate real--车门上锁 失败率
);
-------注释
COMMENT ON COLUMN remote_analyze.timeBegin IS '时间';
COMMENT ON COLUMN remote_analyze.controlNum IS '远控次数';
--建立索引
--create index index_ on remote_send_cmd_history(send_id);
--功能实现
create or replace FUNCTION sear(IN startTime timestamp, IN endTime timestamp, IN str text )
returns void
AS
$$
declare
timeAt timestamp; --时间戳类型
cur refcursor;--动态游标,查找更改,类似指针
rec_cur RECORD;--记录,从游标取出一条记录
--静态游标
cur1 cursor(
star timestamp
)for select count(send_id) from remote_send_cmd_history
where remote_time between star and star + cast(str||'' as interval);
---------------变量-------------------------------
--远控次数
_controlNum remote_analyze.controlNum%type;--%type 类型引用
--远控成功次数
_controlSuccessNum remote_analyze.controlSuccessNum%type;
--远控失败次数
_controlFailseNum remote_analyze.controlFailseNum%type;
--远控失败率
_controlFailseRate remote_analyze.controlFailseRate%type;
------------------------具体功能-------------------------------
_cmd_00101 INTEGER;--总数
_cmd_00101_T INTEGER;--成功次数
_cmd_00101_F INTEGER;--车门上锁 1
_cmd_00101_F_falseRate real;--车门上锁 失败率
num INTEGER;
begin
timeAt := startTime;
while timeAt < endTime loop --循环体 多条件:exp AND/OR exp
--变量清零
_controlNum := 0;
_controlSuccessNum := 0;
_controlFailseNum := 0;
_controlFailseRate := 0;
_cmd_00101_F := 0;--车门上锁 1
_cmd_00101 := 0;--总数
_cmd_00101_T := 0;--成功次数
--打开游标
open cur for select * from remote_send_cmd_history
--cast( str ||'' as interval )为时间间隔 可有:timeAt + ‘1 DAY’
where remote_time between timeAt and timeAt + cast( str ||'' as interval );
--统计数值
loop
fetch cur into rec_cur; --取出下条记录
exit when NOT FOUND;
--远控次数
_controlNum := _controlNum + 1;
--远控成功次数
if rec_cur.status = 'CMD_SUCCEED' then
_controlSuccessNum := _controlSuccessNum + 1;
end if;
--远控失败次数
if rec_cur.status != 'CMD_SUCCEED' then
_controlFailseNum := _controlFailseNum + 1;
end if;
-----------具体功能----失败次数---------------------------
--车门上锁 1
if rec_cur.cmd_code = '00101' then
_cmd_00101 := _cmd_00101 + 1;
if rec_cur.status != 'CMD_SUCCEED' then
_cmd_00101_F := _cmd_00101_F + 1;
else _cmd_00101_T := _cmd_00101_T + 1;
end if;
end if;
---------------------------具体功能-------------------------------
--车门上锁 失败率
if _controlNum != 0 then
_cmd_00101_F_falseRate := _cmd_00101_F * 1.0 / _controlNum;
else _cmd_00101_F_falseRate := 0;
end if;
---=========================插入统计数据============================---
insert into remote_analyze(
timeBegin ,
controlNum ,
controlSuccessNum ,
controlFailseNum,
controlFailseRate,
-----------具体功能-------------------------------
cmd_00101 ,--总数
cmd_00101_T ,--成功次数
cmd_00101_F ,--车门上锁 1
cmd_00101_falseRate --车门上锁 失败率
)values(
timeAt,
_controlNum,
_controlSuccessNum,
_controlFailseNum,
_controlFailseRate,
-----------具体功能-------------------------------
_cmd_00101 ,--总数
_cmd_00101_T ,--成功次数
_cmd_00101_F ,--车门上锁 1
_cmd_00101_F_falseRate --车门上锁 失败率
);
timeAt := timeAt + cast( str ||'' as interval);
end loop;
end;
$$
language plpgsql;
--功能:统计param1到param2的每小时内的远控记录,
--@param startTime : 开始时间
--@param endTime : 结束时间
--@param str : 时间间隔
select sear('2019-09-01 00:00:00', '2019-10-17 00:00:00', '1 HOUR');