近期得到一个需求,是计算某调度流程一段时间的5日平均运行时长,并与当前运行时长一起展示,形成类似于股票行情的K线图。
SCHEDULE.RUNTIMEFLOWLOG表结构如下:
名称 | 数据类型 | 长度 | 备注 |
LOGID | DECIMAL | 20 | ID,主键 |
FLOWID | DECIMAL | 11 | 流程ID |
STATUS | DECIMAL | 11 | 流程状态 |
STARTTIME | TIMESTAMP | 10 | 开始时间 |
ENDTIME | TIMESTAMP | 10 | 结束时间 |
DATATIME | VARCHAR | 32 | 数据时间 |
FLOWTYPE | DECIMAL | 11 |
两个计算字段:
cursec:当前运行时长,单位:秒
avgsec:5日平均运行时长,单位:秒
SQL如下(以DB2为例):
SELECT logid,
status,
datatime,
starttime,
MIDNIGHT_SECONDS (ENDTIME) - MIDNIGHT_SECONDS (STARTTIME) cursec,
AVG(MIDNIGHT_SECONDS (ENDTIME) - MIDNIGHT_SECONDS (STARTTIME))
OVER (PARTITION BY flowid, status
ORDER BY logid DESC
ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING) avgsec
FROM SCHEDULE.RUNTIMEFLOWLOG
WHERE FLOWID = 471
ORDER BY logid DESC;
如为Oracle,只需要将cursec和avgsec计算秒数的部分做相应调整:
(CAST(ENDTIME AS DATE)-CAST(STARTTIME AS DATE))*3600*24
而分析函数的用法此处Oracle和DB2均通用,不需要任何调整。
Data Warehouse For Ever原创文章,转载请注明出处