日志服务支持使用同比环比函数对日志数据进行查询和分析。

同比和环比函数用于比较当前区间的计算结果和之前一个指定区间的结果。

函数 含义 样例
compare(value, time_window) 表示将当前时段计算出来的value值和time_window计算出来的结果进行比较。

value为double或long类型,time_window单位为秒;返回值为数组类型。

返回值分别是当前值、time_window之前的值和当前值与之前值的比值。

*|select compare( pv , 86400) from (select count(1) as pv from log)
compare(value, time_window1, time_window2) 表示当前区间分别和time_window1和time_window2之前的区间值进行比较,结果为json数组。其中,各个值的大小必须满足以下规则:[当前值,time_window1之前的值,time_window2之前的值,当前值/time_window1之前的值,当前值/time_window2之前的值]。 * | select compare(pv, 86400, 172800) from ( select count(1) as pv from log)
compare(value, time_window1, time_window2, time_window3) 表示当前区间分别和time_window1和time_window2,time_window3之前的区间值进行比较,结果为json数组。其中,各个值的大小必须满足以下规则:[当前值,time_window1之前的值,time_window2之前的值,time_window3之前的值,当前值/time_window1之前的值,当前值/time_window2之前的值,当前值/time_window3之前的值]。 * | select compare(pv, 86400, 172800,604800) from ( select count(1) as pv from log)
ts_compare(value, time_window) 表示当前区间分别和time_window1time_window2之前的区间值进行比较,结果为json数组。其中,各个值的大小必须遵循以下规则:[当前值,time_window1之前的值,当前值/time_window1之前的值,前一个时间起点的unix时间戳]。

用于时序函数比较,需要在SQL中对时间列进行GROUP BY。

例如,* | select t, ts_compare(pv, 86400 ) as d from(select date_trunc('minute',__time__ ) as t, count(1) as pv from log group by t order by t ) group by t表示将当前时间段每分钟的计算结果和上一个时间段每分钟的计算结果进行比较。

结果为:d:[1251.0,1264.0, 0.9897151898734177, 1539843780.0,1539757380.0]t:2018-10-19 14:23:00.000

示例

  • 计算当前1小时和昨天同一时段的PV比例。

    开始时间为2018-7-25 14:00:00;结束时间为2018-07-25 15:00:00。

    查询分析语句:

    * | select compare( pv , 86400) from (select count(1) as pv from log)
    其中,86400表示当前时段减去86400秒。
    返回结果:
    [9.0,19.0,0.47368421052631579]
    其中,
    • 9.0表示从2018-7-25 14:00:00到2018-07-25 15:00:00的PV值。
    • 19.0表示2018-7-24 14:00:00到2018-07-24 15:00:00的PV值。
    • 0.47368421052631579表示当前时段与之前时段的比值。
    如果要把数组展开成3列数字,分析语句为:
    * | select diff[1],diff[2],diff[3] from(select compare( pv , 86400) as diff from (select count(1) as pv from log))
  • 计算当前1小时内每分钟的PV和昨天同时段的PV比值,并以折线图展示。
    1. 计算当前1小时内每分钟的PV和昨天同时段的PV比值。开始时间为2018-7-25 14:00:00,结束时间为2018-07-25 15:00:00。

      查询分析语句:

      *| select t, compare( pv , 86400) as diff from (select count(1) as pv, date_format(from_unixtime(__time__), '%H:%i') as t from log group by t) group by t order by t
      返回结果:
      t diff
      14:00 [9520.0,7606.0,1.2516434393899554]
      14:01 [8596.0,8553.0,1.0050274757395066]
      14:02 [8722.0,8435.0,1.0340248962655603]
      14:03 [7499.0,5912.0,1.2684370771312586]
      其中t表示时间,格式为小时:分钟。diff列的内容是一个数组,分别表示:
      • 当前时段的PV值。
      • 之前时段的PV值。
      • 当前时段PV值与之前时段比值。
    2. 通过以下语句将查询结果展开为折线图形式:
      *|select t, diff[1] as current, diff[2] as yestoday, diff[3] as percentage from(select t, compare( pv , 86400) as diff from (select count(1) as pv, date_format(from_unixtime(__time__), '%H:%i') as t from log group by t) group by t order by t)
      将查询结果配置为折线图,两条线分别表示今天的值和昨天的值:
      图 1. 折线图
      折线图