SELECT
a.NAME,
a.TIMESTAMP AS ts1,
b.TIMESTAMP AS ts2,
(b.TIMESTAMP - a.TIMESTAMP) *86400AS time_diff_seconds, -- 计算时间差(秒)
(b.STAT_VAL - a.STAT_VAL) AS stat_diff
FROM
my_sysstat a
JOIN
my_sysstat b
ON
a.NAME = b.NAME
AND a.SNAP_ID < b.SNAP_ID
AND a.TIMESTAMP < b.TIMESTAMP;
示例代码供参考
CREATE SEQUENCE SNAP_ID_SEQ START WITH 1 INCREMENT BY 1;CREATE TABLE my_sysstat ( SNAP_ID NUMBER PRIMARY KEY, -- 唯一标识符,通过序列生成 CLASSID NUMBER, NAME VARCHAR(128), STAT_VAL BIGINT, TIMESTAMP TIMESTAMP DEFAULT CURRENT_TIMESTAMP );INSERT INTO my_sysstat (SNAP_ID, CLASSID, NAME, STAT_VAL, TIMESTAMP) SELECT SNAP_ID_SEQ.NEXTVAL, CLASSID, NAME, STAT_VAL, CURRENT_TIMESTAMP FROM v$sysstat;SELECT a.NAME, a.TIMESTAMP AS ts1, b.TIMESTAMP AS ts2, (b.TIMESTAMP - a.TIMESTAMP) * 86400 AS time_diff_seconds, -- 计算时间差(秒) (b.STAT_VAL - a.STAT_VAL) AS stat_diff FROM my_sysstat a JOIN my_sysstat b ON a.NAME = b.NAME AND a.SNAP_ID < b.SNAP_ID AND a.TIMESTAMP < b.TIMESTAMP;关键设计说明
通过 SNAP_ID_SEQ 确保唯一性,即使同一时间戳插入多条记录也能生成不同 SNAP_ID。
时间戳匹配
a.SNAP_ID < b.SNAP_ID 和 a.TIMESTAMP < b.TIMESTAMP 确保时间顺序,避免重复计算。
差值计算
通过 SNAP_ID 关联相同 NAME 的记录,并利用 TIMESTAMP 计算时间差值。
可扩展至其他字段的差值计算(如数值型字段)。
注意事项
性能优化:若数据量大,建议添加索引(如 NAME 和 TIMESTAMP 字段)以加速查询,另外不宜记录的太频繁 ,如果记录量过大也考虑设计为分区表(按天),历史的(比如15天前)的分区可以直接DROP,这样不会产生很多REDO日志。
此方案是个示例,可结合应用场景进一步优化。