窗口函数OVER(PARTITION BY)的详细用法——语法、函数、开窗范围(ROWS和RANGE)

作者:有好多问题2024.01.22 13:34浏览量:57

简介:本文将详细介绍窗口函数OVER(PARTITION BY)的用法,包括其语法、功能以及开窗范围(ROWS和RANGE)的具体操作。我们将通过实际例子来演示这些概念,使读者能够更清晰地理解这一重要的SQL功能。

在SQL中,窗口函数是一种强大的工具,允许用户在数据集的窗口上执行计算,而无需将数据集分组。OVER()子句用于定义窗口函数操作的窗口范围,它通常与PARTITION BY子句一起使用,以确定如何在特定分区上执行计算。本文将深入探讨窗口函数OVER(PARTITION BY)的详细用法,包括其语法、功能以及开窗范围(ROWS和RANGE)的具体操作。
一、语法
窗口函数的语法通常如下:

  1. <window_function>(<arguments>) OVER (
  2. [PARTITION BY partition_expression, ... ]
  3. [ORDER BY sort_expression [ASC | DESC], ...]
  4. [ROWS frame_specification]
  5. )

其中:

  • <window_function> 是要执行的窗口函数,如ROW_NUMBER()、RANK()等。
  • <arguments> 是传递给窗口函数的参数。
  • PARTITION BY 子句用于将数据集划分为不同的分区,并在每个分区上独立计算窗口函数。
  • ORDER BY 子句用于指定在窗口函数计算中数据的排序方式。
  • ROWS 子句用于定义窗口的行范围。
    二、功能
    窗口函数允许您在不改变查询结果集的情况下,在每个分区上执行聚合计算。通过使用PARTITION BY子句,您可以指定如何将数据集划分为不同的分区,并在每个分区上独立计算窗口函数。这使得您可以在每个分区内执行计算,例如计算每行的排名、累计总和等。
    三、开窗范围(ROWS和RANGE)
    开窗范围定义了窗口函数操作的行范围。它可以通过ROWS或RANGE关键字指定。
  1. ROWS子句
    ROWS子句用于定义一个固定的行范围,它基于当前行与参考行之间的相对位置。您可以使用以下语法定义行范围:
    1. ROWS BETWEEN start_expression AND end_expression
    其中,start_expression和end_expression指定了行范围的起始和结束位置。例如,如果您想从当前行开始向前计算5行的累计总和,可以使用以下查询:
    1. SELECT SUM(column_name) OVER (ORDER BY sort_expression ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS cumulative_sum
    2. FROM table_name;
  2. RANGE子句
    与ROWS子句不同,RANGE子句基于列值来定义行范围。它会根据当前行与参考行之间的值差异来确定行范围。您可以使用以下语法定义范围:
    1. RANGE BETWEEN start_expression AND end_expression
    start_expression和end_expression可以是固定值、符号或表达式,用于指定列值的范围。例如,如果您想根据某个列的值将行分成不同的范围,并计算每个范围内的行的数量,可以使用以下查询:
    1. SELECT COUNT(*) OVER (ORDER BY sort_expression RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS count_in_range
    2. FROM table_name;
    在此查询中,ORDER BY子句指定了按sort_expression列排序的顺序,RANGE子句指定了从UNBOUNDED PRECEDING到当前行的范围。这将计算每个范围内的行数。