详情页标题前

阿里云日志服务SLS窗口函数-云淘科技

详情页1

本文介绍窗口函数的基本语法及示例。

简介

普通的聚合函数只能用来计算一的结果或把所有行聚合成一行结果,而窗口函数支持为每一行生成一个结果。窗口函数包含分区、排序和框架这3个核心元素。更多信息,请参见Window Function Concepts and Syntax。

function over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)
  • 分区:分区元素由partition by子句定义。partition by子句用于划分窗口分区,如果没有指定partition by子句,则整个查询与分析结果集作为一个窗口分区。
  • 排序:排序元素由order by子句定义。order by子句用于对窗口分区内的行进行排序。说明 使用order by子句对重复的数进行排序时,排序结果不稳定。如果您希望每次排序结果相同,可指定多个列进行排序。例如order by request_time, request_method
  • 框架:框架元素在窗口分区内对行进一步限制。框架元素不适用于排名函数。框架子句的语法为{ rows | range} { frame_start | frame_between },例如range between unbounded preceding and unbounded following。更多信息,请参见Window Function Frame Specification。

函数列表

分类 函数名称 语法 说明
聚合函数 聚合函数 所有聚合函数都支持在窗口函数中使用。聚合函数列表请参见聚合函数。
排名函数 cume_dist函数 cume_dist() 统计窗口分区内各个值的累计分布。即计算窗口分区内值小于等于当前值的行数占窗口内总行数的比例。返回值范围为(0,1]。
dense_rank函数 dense_rank() 窗口分区内值的排名。相同值拥有相同的排名,排名是连续的,例如有两个相同值的排名为1,则下一个值的排名为2。
ntile函数 ntile(n) 将窗口分区内数据按照顺序分成N组。
percent_rank函数 percent_rank() 计算窗口分区内各行的百分比排名。
rank函数 rank() 窗口分区内值的排名。相同值拥有相同的排名,排名不是连续的,例如有两个相同值的排名为1,则下一个值的排名为3。
row_number函数 row_number() 窗口分区内值的排名。每个值拥有唯一的序号,从1开始。三个相同值的排名为1、2、3。
偏移函数 first_value函数 first_value(x) 返回各个窗口分区内第一行的值。
last_value函数 last_value(x) 返回各个窗口分区内最后一行的值。
lag函数 lag(x, offset, defaut_value) 返回窗口分区内位于当前行上方第offset行的值。如果不存在该行,则返回defaut_value
lead函数 lead(x, offset, defaut_value) 返回窗口分区内位于当前行下方第offset行的值。如果不存在该行,则返回defaut_value
nth_value函数 nth_value(x, offset) 返回窗口分区中第offset行的值。

聚合函数

所有聚合函数都支持在窗口函数中使用。聚合函数列表请参见聚合函数。此处以sum函数为例。

语法

sum() over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)

参数说明

参数 说明
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。
frame 窗口框架,例如range between unbounded preceding and unbounded following

返回值类型

double类型。

示例

按照部门分区,获取每个员工薪水在部门内的占比。

  • 查询和分析语句
    * |
    SELECT
      department,
      staff_name,
      salary,
      round ( salary * 1.0 / sum(salary) over(partition by department), 3) AS salary_percentage 
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

cume_dist函数

cume_dist函数用于统计窗口分区内各个值的累计分布。即计算窗口分区内值小于等于当前值的行数占窗口内总行数的比例。返回值范围为(0,1]。

语法

cume_dist() over (
    [partition by partition_expression]
    [order by order_expression]
)

参数说明

参数 说明
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。

返回值类型

double类型。

示例

统计名为bucket00788的OSS Bucket内各个对象的大小的累计分布。

  • 查询和分析语句
    bucket=bucket00788 |
    select
      object,
      object_size,
      cume_dist() over (
        partition by object
        order by
          object_size
      ) as cume_dist
    from  oss-log-store
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

dense_rank函数

dense_rank函数用于窗口分区内值的排名。相同值拥有相同的排名,排名是连续的,例如有两个相同值的排名为1,则下一个值的排名为2。

语法

dense_rank() over (
    [partition by partition_expression]
    [order by order_expression]
)

参数说明

参数 说明
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。

返回值类型

bigint类型。

示例

按照部门分区,计算员工薪水在部门内的排名。

  • 查询和分析语句
    * |
    select
      department,
      staff_name,
      salary,
      dense_rank() over(
        partition by department
        order by
          salary desc
      ) as salary_rank
    order by
      department,
      salary_rank
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

ntile函数

ntile函数用于将窗口分区内数据按照顺序分成N组。

语法

ntile(n) over (
    [partition by partition_expression]
    [order by order_expression]
)

参数说明

参数 说明
n 组数。
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。

返回值类型

bigint类型。

示例

将指定对象中的数据分成3组。

  • 查询和分析语句
    object=245-da918c.model |
    select
      object,
      object_size,
      ntile(3) over (
        partition by object
        order by
          object_size
      ) as ntile
    from  oss-log-store
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

percent_rank函数

函数用于计算窗口分区内各行的百分比排名。计算公式为(rank - 1) / (total_rows - 1) ,其中rank为当前行的排名,total_rows为当前窗口分区内的总行数。

语法

percent_rank() over (
    [partition by partition_expression]
    [order by order_expression]
)

参数说明

参数 说明
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。

返回值类型

double类型。

示例

计算目标OSS对象的不同大小的百分比排名。

  • 查询和分析语句
    object=245-da918c3e2dd9dc9cb4d9283b%2F555e2441b6a4c7f094099a6dba8e7a5f.model|
    select
      object,
      object_size,
     percent_rank() over (
        partition by object
        order by
          object_size
      ) as ntile
    FROM  oss-log-store
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

rank函数

函数用于窗口分区内值的排名。相同值拥有相同的排名,排名不是连续的,例如有两个相同值的排名为1,则下一个值的排名为3。

语法

rank() over (
    [partition by partition_expression]
    [order by order_expression]
)

参数说明

参数 说明
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。

返回值类型

bigint类型。

示例

按照部门分区,计算员工薪水在部门内的排名。

  • 查询和分析语句
    * |
    select
      department,
      staff_name,
      salary,
      rank() over(
        partition by department
        order by
          salary desc
      ) as salary_rank
    order by
      department,
      salary_rank
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

row_number函数

row_number函数用于窗口分区内值的排名。每个值拥有唯一的序号,从1开始。

语法

row_number() over (
    [partition by partition_expression]
    [order by order_expression]
)

参数说明

参数 说明
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。

返回值类型

bigint类型。

示例

按照部门分区,计算员工薪水在部门内的排名。

  • 查询和分析语句
    * |
    select
      department,
      staff_name,
      salary,
      row_number() over(
        partition by department
        order by
          salary desc
      ) as salary_rank
    order by
      department,
      salary_rank
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

first_value函数

first_value函数用于返回各个窗口分区内第一行的值。

语法

first_value(x) over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)

参数说明

参数 说明
x 列名,可以为任意数据类型。
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。
frame 窗口框架,例如range between unbounded preceding and unbounded following

返回值类型

x的数据类型一致。

示例

获取目标OSS Bucket中各个对象的最小值。

  • 查询和分析语句
    bucket :bucket90 |
    select
      object,
      object_size,
      first_value(object_size) over (
        partition by object
        order by
          object_size 
         range between unbounded preceding and unbounded following
      ) as first_value
    from  oss-log-store
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

last_value函数

last_value函数用于返回各个窗口分区内最后一行的值。

语法

last_value(x) over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)

参数说明

参数 说明
x 列名,可以为任意数据类型。
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。
frame 窗口框架,例如range between unbounded preceding and unbounded following

返回值类型

x的数据类型一致。

示例

获取目标OSS Bucket中各个对象的最大值。

  • 查询和分析语句
    bucket :bucket90 |
    select
      object,
      object_size,
      last_value(object_size) over (
        partition by object
        order by
          object_size 
         range between unbounded preceding and unbounded following
      ) as last_value
    from  oss-log-store
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

lag函数

lag函数用于返回窗口分区内位于当前行上方第offset行的值。

语法

lag(x, offset, defaut_value) over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)

参数说明

参数 说明
x 列名,可以为任意数据类型。
offset 偏离量。如果offset为0,则返回当前行的值。
defaut_value 如果不存在指定的偏离行,则返回defaut_value
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。
frame 窗口框架,例如range between unbounded preceding and unbounded following

返回值类型

x的数据类型一致。

示例

按天统计网站访问UV,获取每天网站访问UV相比前一天的增长情况。

  • 查询和分析语句
    * |
    select
      day,
      UV,
      UV * 1.0 /(lag(UV, 1, 0) over()) as diff_percentage
    from  (
        select
          approx_distinct(client_ip) as UV,
          date_trunc('day', __time__) as day
        from  log
        group by
          day
        order by
          day asc
      )
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

lead函数

函数用于返回窗口分区内位于当前行下方第offset行的值。

语法

lead(x, offset, defaut_value) over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)

参数说明

参数 说明
x 列名,可以为任意数据类型。
offset 偏离量。如果offset为0,则返回当前行的值。
defaut_value 如果不存在指定的偏离行,则返回defaut_value
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。
frame 窗口框架,例如range between unbounded preceding and unbounded following

返回值类型

x的数据类型一致。

示例

计算2021-08-26当天,当前一小时网站访问UV与后一小时的占比情况。

  • 查询和分析语句
    * |
    select
      time,
      UV,
      UV * 1.0 /(lead(UV, 1, 0) over()) as diff_percentage
    from  (
        select
          approx_distinct(client_ip) as uv,
          date_trunc('hour', __time__) as time
        from    log
        group by
          time
        order by
          time asc
      )
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

nth_value函数

nth_value函数用于返回窗口分区中第offset行的值。

语法

nth_value(x, offset) over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)

参数说明

参数 说明
x 列名,可以为任意数据类型。
offset 偏离量。
partition by partition_expression 窗口分区,根据分区表达式将数据划分成不同的分区。
order by order_expression 窗口排序,根据排序表达式对各个分区内的每一行进行排序。
frame 窗口框架,例如range between unbounded preceding and unbounded following

返回值类型

x的数据类型一致。

示例

按照部门分区,统计各个部门中薪水第二高的员工。

  • 查询和分析语句
    * |
    select
      department,
      staff_name,
      salary,
      nth_value(staff_name, 2) over(
        partition by department
        order by
          salary desc
          range between unbounded preceding and unbounded following
      ) as second_highest_salary from log
  • 查询和分析结果阿里云日志服务SLS窗口函数-云淘科技

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/164129.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云日志服务SLS字符串函数-云淘科技

    本文介绍字符串函数的语法规则,包括参数解释、函数示例等。 函数列表 类型 函数 说明 多字符串操作 str_format 按照指定格式对字符串进行格式化。 str_join 通过连接符将输入的字符串连接生成一个新的字符串。 str_zip 将两个值或表达式的字符串进行并发分裂然后再合并成一个字符串。 编码解码 str_encode 按照指定的编码格式对字符串…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云日志服务SLS扫描(Scan)查询概述-云淘科技

    日志服务扫描(Scan)查询功能支持免配置索引进行目标字段的扫描,用于查询相关日志。本文介绍扫描查询功能的相关信息。 背景信息 日志服务基于索引技术,提供快速查询日志功能,但在某些场景下可能会遇到如下限制,无法创建或使用索引。 为降低使用费用,而未对某些字段建立索引,但临时急需查询历史日志。 字段值长度超过了索引限制,超出部分无法被查询。 字段名较多,事先无…

    阿里云日志服务SLS 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云日志服务SLS语法简介-云淘科技

    SLS DSL基于Python语言开发,提供两百多个内置函数来简化数据加工任务。本文介绍DSL的语言模式、分类和运行原理等。 语言模式 SLS DSL兼容Python,标准模式下,SLS DSL可视为Python的子集。除基本的数据结构与表达方式外,语法规则是以函数方式进行编排。如果您有特定UDF的需求,请提交工单。 类别 Python语法 标准模式 数据结…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云日志服务SLS日期时间函数-云淘科技

    本文介绍日期时间函数的语法规则,包括参数解释、函数示例等。 在SLS DSL加工逻辑中,日志中的所有值都以字符串的形式存储,需要根据场景对数据类型进行转换。 日志中时间主要有以下三种数据类型,您可以根据本文提供的日期时间函数进行日期时间格式转换。 字符串 例如2022/07/03 02-41-26。 Unix时间戳 例如1559500886。 日期时间对象 …

    阿里云日志服务SLS 2023年12月10日
  • 阿里云云原生大数据计算服务 MaxComputeNVL-云淘科技

    如果value值为NULL,返回default_value,否则返回value。两个参数的数据类型必须一致。 命令格式 nvl(T , T ) 参数说明 value:必填。输入参数。T指代输入数据类型,可以是MaxCompute支持的所有数据类型。 default_value:必填。替换后的值。必须与value的数据类型保持一致。 使用示例 例如表t_dat…

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。