本文介绍同比和环比函数的基础语法和示例。
日志服务支持如下同比和环比函数。
函数名称 | 语法 | 说明 | 支持SQL | 支持SPL |
compare(x, n) | 对比当前时间周期内的计算结果与n秒之前时间周期内的计算结果。 | √ | × | |
compare(x, n1, n2, n3...) | 对比当前时间周期内的计算结果与n1、n2、n3秒之前时间周期内的计算结果。 | √ | × | |
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 )
查询和分析结果
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
查询和分析结果
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
查询和分析结果
说明查询和分析结果的时间,以实际执行结果为准。