同比和环比函数

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

日志服务支持如下同比和环比函数。

重要 在日志服务分析语句中,表示字符串的字符必须使用单引号('')包裹,无符号包裹或被双引号("")包裹的字符表示字段名或列名。例如:'status'表示字符串status,status"status"表示日志字段status。

函数名称

语法

说明

支持SQL

支持SPL

compare函数

compare(x, n)

对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。

×

compare(x, n1, n2, n3...)

对比当前时间周期内的计算结果与n1、n2、n3秒之前时间周期内的计算结果。

×

ts_compare函数

ts_compare(x, n)

对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。

×

ts_compare(x, n1, n2, n3...)

对比当前时间周期内的计算结果与n1、n2、n3秒之前时间周期内的计算结果。

×

重要
  • 使用compare函数时,进行对比的时间必须相同。

    例如支持对比当前1小时与昨天同时段的数据,但不支持对比当前1小时与上1小时的数据。

  • ts_compare函数必须按照时间列进行分组(GROUP BY)。

compare函数

compare函数用于对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。

语法

  • 对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。

    compare(x, n)
  • 对比当前时间周期内的计算结果与n1、n2、n3秒之前时间周期内的计算结果。

    compare(x, n1, n2, n3...)

参数说明

参数

说明

x

参数值为double类型或long类型。

n

时间窗口,单位为秒。例如3600(1小时)、86400(1天)、604800(1周)、31622400(1年)。

返回值类型

数组。格式为[当前计算结果, n秒前的计算结果, 当前计算结果与n秒前计算结果的比值]。

示例

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

    选择查询和分析的时间范围为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)的网站访问量。

        • 3522.0表示昨天同时段(例如2020-12-24 14:00:00~2020-12-24 15:00:00)的网站访问量。

        • 0.947473026689381表示当前1小时与昨天同时段的网站访问量比值。

    • 查询和分析结果为分列显示

      • 查询和分析语句(调试

        * |
        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
              )
          )

        compare函数计算结果为数组形式,其中diff为compare函数计算结果的别名,diff [1]表示获取数组中的第一个值。

      • 查询和分析结果同比结果

        • 3337.0表示当前1小时(例如2020-12-25 14:00:00~2020-12-25 15:00:00)的网站访问量。

        • 3522.0表示昨天同时段(例如2020-12-24 14:00:00~2020-12-24 15:00:00)的网站访问量。

        • 0.947473026689381表示当前1小时与昨天同时段的网站访问量比值。

  • 示例2:统计当前1小时内各个请求状态对应的请求方法,以及该请求状态和请求方法对应的请求数量和昨天同时段的对比。

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

    • 查询和分析语句(调试

      * |
      SELECT
        status,
        request_method,
        compare(PV, 3600)
      FROM  (
          SELECT
            status,
            request_method,
            count(*) AS PV
          FROM      log
          GROUP BY
            status,
            request_method
        )
      GROUP BY
        status,
        request_method
    • 查询和分析结果同比和环比函数

ts_compare函数

ts_compare函数用于对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。

重要

ts_compare函数必须按照时间列进行分组(GROUP BY)。

语法

  • 对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。

    ts_compare(x, n)
  • 对比当前时间周期内的计算结果与n1、n2、n3秒之前时间周期内的计算结果。

    ts_compare(x, n1, n2, n3...)

参数说明

参数

说明

x

参数值为double类型或long类型。

n

时间窗口,单位为秒。例如3600(1小时)、86400(1天)、604800(1周)、31622400(1年)。

返回值类型

数组。格式为[当前计算结果, n秒前的计算结果, 当前计算结果与n秒前计算结果的比值, n秒前的UNIX时间戳]。

示例

  • 示例1:计算今天每小时的网站访问量与昨天同时段、前天同时段的网站访问量比值。

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

    • 查询和分析结果为数组形式

      • 查询和分析语句(调试

        * |
        SELECT
          time,
          ts_compare(PV, 86400, 172800) as diff
        FROM  (
            SELECT
              count(*) as PV,
              date_trunc('hour', __time__) AS time
            FROM      log
            GROUP BY
              time
          )
        GROUP BY
          time
        ORDER BY
          time
      • 查询和分析结果每分钟PV

        • 1174.0表示当前时段(例如2022-09-22 00:00~01:00)的网站访问量。

        • 1191.0表示昨天同时段(例如2022-09-21 00:00~01:00)的网站访问量。

        • 1253.0表示前天同时段(例如2022-09-20 00:00~01:00)的网站访问量。

        • 0.9857262804366079表示当前时段与昨天同时段的网站访问量比值。

        • 0.936951316839585表示当前时段与前天同时段的网站访问量比值。

        • 1663689600.0表示2022-09-21 00:00的Unix时间戳。

        • 1663603200.0表示2022-09-20 00:00的Unix时间戳。

        说明

        查询和分析结果的时间,以实际执行结果为准。

    • 查询和分析结果为分列显示

      • 查询和分析语句(调试

        * |
        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,
              ts_compare(PV, 86400, 172800) AS diff
            FROM      (
                SELECT
                  count(*) as PV,
                  date_trunc('hour', __time__) AS time
                FROM          log
                GROUP BY
                  time
              )
            GROUP BY
              time
            ORDER BY
              time
          )
      • 查询和分析结果同比

  • 示例2:环比今天每小时的网站访问量。

    选择查询和分析的时间范围为今天(相对),并执行如下查询和分析语句。其中3600表示当前时间减去3600秒(1小时), log表示Logstore名称,date_trunc('hour',__time__ )表示使用date_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

      说明

      查询和分析结果的时间,以实际执行结果为准。