You need to enable JavaScript to run this app.
导航

窗口函数

最近更新时间2024.04.19 11:28:18

首次发布时间2024.04.19 11:28:18

本文介绍日志服务支持的窗口函数语法及常见场景的使用示例。
窗口函数用于聚合、排序等操作,包含分区、排序和框架这三个核心元素。不同于普通聚合函数,窗口函数支持为每一行数据生成一个结果。

函数列表

说明

在日志服务分析语句(SQL 语句)中,需要使用单引号('')包裹代表字符串的字符,无符号包裹或被双引号("")包裹的字符为字段名或列名。例如'time' 代表字符串,time"time" 代表字段名或列名。

函数名称

语法

说明

LAG 函数

LAG(KEY, offset, default_value)

查询分区内位于当前行上方第 offset 行的值。

LEAD 函数

LEAD(KEY, offset, default_value)

查询分区内位于当前行下方第 offset 行的值。

LAG 函数

LAG 函数用于查询分区内位于当前行上方第 offset 行的值。

函数语法

  • 语法格式

    LAG(KEY, offset, default_value) over (
        [partition by partition_expression]
        [order by order_expression]
        [frame]
    )
    
  • 参数说明

    参数

    说明

    KEY

    日志字段、表达式,其值可以为任意数据类型。

    offset

    指定偏移量。如果 offset 为 0,则返回当前行的值。

    default_value

    指定默认值,如果指定的偏移行不存在值,则返回您所指定的默认值。

    partition by
    partition_expression

    窗口函数将根据分区表达式将各行数据分为不同的分区。

    order by
    order_expression

    窗口函数将根据排序表达式对各个分区内的各行数据进行排序。

    frame

    窗口框架。

  • 返回值说明
    返回值与 KEY 的数据类型一致。

函数示例

  • 场景
    计算每小时的请求数量以及一小时内的请求数量与前一小时的占比。

  • 检索和分析语句

    * |
    SELECT
      hour,
      total,
      total * 1.00000 /(LAG(total, 1, 1) over(ORDER BY hour)) AS ratio 
    FROM  (
        SELECT
          COUNT(Action) AS total,
          DATE_TRUNC('hour', __time__) AS hour
        GROUP BY
          hour
      )
    
  • 检索和分析结果
    图片

LEAD 函数

LEAD 函数用于查询分区内位于当前行下方第 offset 行的值。

函数语法

  • 语法格式

    LEAD(KEY, offset, default_value) over (
        [partition by partition_expression]
        [order by order_expression]
        [frame]
    )
    
  • 参数说明

    参数

    说明

    KEY

    日志字段、表达式,其值可以为任意数据类型。

    offset

    指定偏移量。如果 offset 为 0,则返回当前行的值。

    default_value

    指定默认值,如果指定的偏移行不存在值,则返回您所指定的默认值。

    partition by
    partition_expression

    窗口函数将根据分区表达式将各行数据分为不同的分区。

    order by
    order_expression

    窗口函数将根据排序表达式对各个分区内的各行数据进行排序。

    frame

    窗口框架。

  • 返回值说明
    返回值与 KEY 的数据类型一致。

函数示例

  • 场景
    计算每小时的请求数量以及一小时内的请求数量与后一小时的占比。

  • 检索和分析语句

    * |
    SELECT
      hour,
      total,
      total * 1.00000 /(LEAD(total, 1, 1) over(ORDER BY hour)) AS ratio 
    FROM  (
        SELECT
          COUNT(Action) AS total,
          DATE_TRUNC('hour', __time__) AS hour
        GROUP BY
          hour
      )
    
  • 检索和分析结果
    图片