You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指标与过去x天同一时段平均值对比?offset函数扩展用法

实现指标与过去X天同期平均值对比的方案

针对你需要将当日某时段指标平均值与过去X天同一时段平均值对比的需求,以下是不同工具场景下的实现方法,完全可以扩展到一周(X=7)或一个月(X=30):

1. SQL 实现(通用数据查询场景)

假设你的数据表包含metric_value(指标数值)、record_time(记录时间戳)字段,核心思路是先按天聚合同期时段的平均值,再计算这些日均值的整体平均。

今日目标时段平均值

SELECT AVG(metric_value) AS today_avg
FROM your_table
WHERE record_time BETWEEN CURRENT_DATE + INTERVAL '13 hours' 
                      AND CURRENT_DATE + INTERVAL '14 hours';

过去X天同一时段的平均值

SELECT AVG(daily_avg) AS past_x_days_avg
FROM (
    -- 先计算过去X天每天13-14点的平均值
    SELECT AVG(metric_value) AS daily_avg
    FROM your_table
    WHERE record_time >= CURRENT_DATE - INTERVAL 'X days' + INTERVAL '13 hours'
      AND record_time < CURRENT_DATE + INTERVAL '13 hours'
    GROUP BY DATE(record_time) -- 按天分组,确保每天只算一次同期均值
) AS daily_avgs;

合并对比结果

SELECT
    (SELECT AVG(metric_value) FROM your_table 
     WHERE record_time BETWEEN CURRENT_DATE + INTERVAL '13 hours' 
                           AND CURRENT_DATE + INTERVAL '14 hours') AS today_avg,
    (SELECT AVG(daily_avg) FROM (
        SELECT AVG(metric_value) AS daily_avg
        FROM your_table
        WHERE record_time >= CURRENT_DATE - INTERVAL 'X days' + INTERVAL '13 hours'
          AND record_time < CURRENT_DATE + INTERVAL '13 hours'
        GROUP BY DATE(record_time)
    ) AS daily_avgs) AS past_x_days_avg;

注意:将X替换为实际天数(如7、30),若涉及多时区,需添加AT TIME ZONE子句处理时区转换。

2. Excel 实现(桌面办公场景)

假设A列为日期(格式YYYY-MM-DD)、B列为时间(格式HH:MM)、C列为指标值,可通过AVERAGEIFS结合数组公式实现:

今日13-14点平均值

=AVERAGEIFS(C:C, A:A, TODAY(), B:B, ">="&TIME(13,0,0), B:B, "<"&TIME(14,0,0))

过去X天同期平均值

=AVERAGE(INDEX(AVERAGEIFS(C:C, A:A, TODAY()-ROW(INDIRECT("1:"&X)), B:B, ">="&TIME(13,0,0), B:B, "<"&TIME(14,0,0)),0,1))

注意:将X替换为天数,旧版Excel需按Ctrl+Shift+Enter作为数组公式执行。

3. PromQL 实现(监控指标场景)

针对Prometheus这类监控系统,利用avg_over_time和offset扩展实现多日同期对比:

今日13-14点平均值(当前时间需在14点之后)

avg_over_time(metric_name[1h] offset 0h)

过去X天同一时段的平均值

如果X较小(如一周),可直接枚举每日偏移:

avg(
  avg_over_time(metric_name[1h] offset 1d)
  or avg_over_time(metric_name[1h] offset 2d)
  or avg_over_time(metric_name[1h] offset 3d)
  or avg_over_time(metric_name[1h] offset 4d)
  or avg_over_time(metric_name[1h] offset 5d)
  or avg_over_time(metric_name[1h] offset 6d)
  or avg_over_time(metric_name[1h] offset 7d)
)

如果X较大(如一个月),用范围聚合简化:

sum_over_time(avg_over_time(metric_name[1h] offset 1d)[30d:1d]) / 30

逻辑:先每天取13-14点的1小时均值,再对过去30天的这些值求和后除以30,得到整体平均。

内容的提问来源于stack exchange,提问作者Farhan Jailani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:03:27