本文介绍同比和环比函数的基础语法和示例。

compare()函数

用于对比当前时间周期内的计算结果与N秒之前时间周期内的计算结果,实现数据的同比或环比。

  • 语法
    compare(列名,N)
    说明 compare()函数可对比多个时段的计算结果,例如compare(列名,N1,N2,N3)。
    • 列名:目标列的列名。该列的值必须为double类型或long类型。
    • N:时间窗口,单位为秒。例如3600(1小时)、86400(1天)、604800(1周)。
  • 返回结果

    返回结果为JSON数组,格式为[当前值,N秒前的值,当前值与N秒前的值的比值,N秒前的UNIX时间戳]。例如[1176.0,1180.0,0.9966101694915255,1611504000.0]。

  • 示例
    • 计算当前1小时和昨天同时段的访问PV比值。

      选择时间范围为1小时(整点),并执行如下查询和分析语句。其中,86400表示当前时间减去86400秒(1天),log表示Logstore名称。

      * | SELECT compare(PV, 86400) FROM (SELECT count(*) AS PV FROM log)
      返回结果如下图所示:PV比
      • 3337.0表示当前1小时(例如2020-12-25 14:00:00~2020-12-25 15:00:00)的访问PV。
      • 3522.0表示昨天同时段(例如2020-12-24 14:00:00~2020-12-24 15:00:00)的访问PV。
      • 0.947473026689381表示当前1小时与昨天同时段的访问PV比值。
      当您需要分列显示分析结果时,可执行如下查询和分析语句:
      * | SELECT diff[1] AS today, diff[2] AS yesterday, diff[3] AS ratio FROM (SELECT compare(PV,86400) AS diff FROM (SELECT count(*) AS PV FROM log))
      返回结果如下图所示:同比结果
      说明

      当您需要同比去年或上周的数据时,可参见如下查询和分析语句。

      • 例如计算2020年11月和2019年11月的访问PV比值,可选择时间范围为2020-11-01 00:00~2020-12-01 00:00,并执行如下查询和分析语句。
        * | SELECT compare(PV, 31622400) FROM (SELECT count(*) AS PV FROM log)
      • 例如计算本周二和上周二的访问PV比值,可选择时间范围为2021-01-18 00:00~2021-01-19 00:00,并执行如下查询和分析语句。
        * | SELECT compare(PV, 604800) FROM (SELECT count(*) AS PV FROM log)
    • 计算今天每小时的访问PV与昨天同时段、前天同时段的访问PV比值。

      选择时间范围为今天(整点),并执行如下查询和分析语句。其中,86400表示当前时间减去86400秒(1天),172800表示当前时间减去172800秒(2天), log表示Logstore名称,date_format(from_unixtime(__time__), '%H:00')表示返回的时间格式。

      * | SELECT time, compare(PV, 86400,172800) as diff from (SELECT count(*) as PV, date_format(from_unixtime(__time__), '%H:00') as time from log GROUP BY time) GROUP BY time ORDER BY time
      返回结果如下图所示:每分钟PV
      • 1176.0表示当前时段(例如2020-12-25 00:00~01:00)的PV值。
      • 1180表示昨天同时段(例如2020-12-24 00:00~01:00)的PV值。
      • 1167.0表示前天同时段(例如2020-12-23 00:00~01:00)的PV值。
      • 0.9966101694915255表示当前时段与昨天同时段的PV比值。
      • 1.0077120822622108表示当前时段与前天同时段的PV比值。
      当您需要分列显示分析结果时,可执行如下查询和分析语句:
      * | SELECT time, diff[1] AS day1, diff[2] AS day2, diff[3] AS day3, diff[4] AS ratio1,  diff[5] AS ratio2 FROM (SELECT time, compare(PV, 86400,172800) as diff from (SELECT count(*) as PV, date_format(from_unixtime(__time__), '%H:00') as time from log GROUP BY time) GROUP BY time ORDER BY time)
      返回结果如下图所示:同比
    • 环比12月和11月的访问PV。

      选择时间范围为本月(整点),并执行如下查询和分析语句。其中,2592000表示当前时间减去2592000秒(1个月), log表示Logstore名称,date_trunc('month', __time__)表示使用data_trunc函数将时间对齐到月份。

      *| SELECT time, compare(PV, 2592000) AS diff from (SELECT count(*) AS PV, date_trunc('month', __time__) AS time from log GROUP BY time) GROUP BY time ORDER BY time
      返回结果如下图所示:环比PV

ts_compare()函数

用于对比当前时间周期内的计算结果与N秒之前时间周期内的计算结果,实现时序数据的同比或环比。ts_compare()函数必须按照时间列进行分组(GROUP BY)。

  • 语法
    ts_compare(列名,N)
    说明 ts_compare()函数可对比多个时段的计算结果,例如ts_compare(列名,N1,N2,N3)。
    • 列名:目标列的列名。该列的值必须为double类型或long类型。
    • N:时间窗口,单位为秒。例如3600(1小时)、86400(1天)、604800(1周)。
  • 返回结果

    返回结果为JSON数组,格式为[当前值,N秒前的值,当前值与N秒前的值的比值,N秒前的UNIX时间戳]。例如[1176.0,1180.0,0.9966101694915255,1611504000.0]。

  • 示例

    环比今天每小时的PV。

    选择时间范围为今天(相对),并执行如下查询和分析语句。其中,3600表示当前时间减去3600秒(1小时), log表示Logstore名称,date_trunc('hour',__time__ )表示使用data_trunc函数将时间对齐到小时。

    * | SELECT time, ts_compare(PV, 3600) AS data FROM(SELECT date_trunc('hour',__time__ ) AS time, count(*) AS PV from log GROUP BY time ORDER BY time ) GROUP BY time
    返回结果如下图所示:ts_compare