すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:Window 関数

最終更新日:Aug 23, 2024

このトピックでは、ウィンドウ関数の構文について説明し、ウィンドウ関数の使用方法の例を示します。

概要

集計関数は行のグループの単一の結果を計算し、ウィンドウ関数はグループ内の各行の結果を計算します。 ウィンドウ関数には、パーティション、オーダー、フレームの3つの要素があります。 詳細については、「ウィンドウ関数の概念と構文」をご参照ください。

function over (
    [partition by partition_expression]
    [order by order_expression]
    [frame]
)
  • Partition: partition要素は、PARTITION by句によって定義されます。 PARTITION BY句は、行をパーティションに分離します。 PARTITION BY句を指定しない場合、すべての行は単一のパーティションとして扱われます。

  • Order: order要素は、ORDER by句によって定義されます。 ORDER BY句は、すべてのパーティションの行をソートします。

    説明

    ORDER BY句を使用して同じ値を持つフィールドの行を並べ替える場合、これらの行の順序は非決定的です。 ORDER BY句に追加のフィールドを含めて、これらの行の予想される順序を取得できます。 例: order by request_time, request_method

  • Frame: frame要素はFRAME句で定義されます。 FRAME句は、各パーティションのサブセットを指定します。 フレームはさらに、各パーティション内の行を洗練する。 ランキング関数にFRAME句を指定することはできません。 FRAME句の構文: { rows | range} { frame_start | frame_between } 例: unbounded preceding and unbounded following 詳細については、「ウィンドウ関数フレームの仕様」をご参照ください。

関数

カテゴリ

関数

構文

説明

SQLでサポート

SPLでサポート

集計関数

集計関数

なし

すべての集計関数をウィンドウ関数として使用できます。 集計関数の詳細については、「集計関数」をご参照ください。

×

ランキング関数

cume_dist関数

cume_dist()

パーティション内の各値の累積分布を計算します。 結果は除算を使用して得られます。 分子は、フィールド値が指定された行のフィールド値以下である行の数です。 指定された行もカウントされます。 分母は、パーティション内の行の総数です。 計算は、パーティション内の行の順序に基づいています。 戻り値の範囲は (0,1) です。

×

dense_rank関数

dense_rank()

パーティション内の指定されたフィールドの各値のランクを計算します。 2つの値が同じ場合、同じランクが割り当てられます。 ランクは連続しています。 例えば、2つの値に同じランク1が割り当てられる場合、次のランクは2である。

×

ntile関数

ntile( n)

各パーティションの行を、Nパラメーターで指定されたグループ数に分割します。

×

percent_rank関数

percent_rank()

パーティション内の各行のパーセンテージランキングを計算します。

×

ランク関数

rank()

パーティション内の指定されたフィールドの各値のランクを計算します。 2つの値が同じ場合、同じランクが割り当てられます。 ランクは連続していません。 例えば、2つの値に同じランク1が割り当てられる場合、次のランクは3である。

×

row_number関数

row_number()

パーティション内の指定されたフィールドの各値のランクを計算します。 各値には一意のランクが割り当てられます。 ランクは1から始まります。 例えば、3つの値が同じであれば、1、2、3のランクが割り当てられる。

×

オフセット関数

first_value関数

first_value( x)

各パーティションの最初の行の指定されたフィールドの値を返します。

×

last_value関数

last_value( x)

各パーティションの最後の行にある指定されたフィールドの値を返します。

×

ラグ関数

lag( xoffsetdefault_value)

パーティション内の現在の行の前の指定されたオフセットにある行の指定されたフィールドの値を返します。 現在の行の前の指定されたオフセットに行が存在しない場合、default_valueで指定された値が返されます。

×

リード関数

lead( xoffsetdefault_value)

パーティションの現在の行の後の指定されたオフセットにある行の指定されたフィールドの値を返します。 現在の行の後の指定されたオフセットに行が存在しない場合、default_valueで指定された値が返されます。

×

nth_value関数

nth_value( xオフセット)

パーティションの先頭から指定されたオフセットにある行の指定されたフィールドの値を返します。

×

集計関数

すべての集計関数をウィンドウ関数として使用できます。 集計関数の詳細については、「集計関数」をご参照ください。 次の例は、ウィンドウ関数として合計関数を使用する方法を示しています。

構文

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

パラメーター

パラメーター

説明

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

フレーム

各パーティションのサブセットを指定します。 例: unbounded preceding and unbounded following

戻り値のデータ型

ダブルタイプ。

各部門の各従業員給与の割合を計算します。

  • クエリ文

    * |
    SELECT
      department,
      staff_name,
      salary,
      round ( salary * 1.0 / sum(salary) over(partition by department), 3) AS salary_percentage 
  • クエリと分析結果 sum

cume_dist関数

cume_dist関数は、パーティション内の各値の累積分布を計算します。 結果は除算を使用して得られます。 分子は、フィールド値が指定された行のフィールド値以下である行の数です。 指定された行もカウントされます。 分母は、パーティション内の行の総数です。 計算は、パーティション内の行の順序に基づいています。 戻り値の範囲は (0,1) です。

構文

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

パラメーター

パラメーター

説明

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

戻り値のデータ型

ダブルタイプ。

bucket00788という名前のOSSバケット内の各オブジェクトのサイズの累積分布を計算します。

  • クエリ文

    bucket=bucket00788 |
    select
      object,
      object_size,
      cume_dist() over (
        partition by object
        order by
          object_size
      ) as cume_dist
    from  oss-log-store

    から

  • クエリと分析結果 cume_dist

dense_rank関数

dense_rank関数は、パーティション内の指定されたフィールドの各値のランクを計算します。 2つの値が同じ場合、同じランクが割り当てられます。 ランクは連続しています。 例えば、2つの値に同じランク1が割り当てられる場合、次のランクは2である。

構文

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

パラメーター

パラメーター

説明

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

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
  • クエリと分析結果 dense_rank

ntile関数

ntile関数は、各パーティションの行をNパラメーターで指定されたグループ数に分割します。

構文

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

パラメーター

パラメーター

説明

n

グループの数を指定します。

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

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

    から

  • クエリと分析結果 ntile

percent_rank関数

percent_rank関数は、パーティション内の各行のパーセンテージランキングを計算します。 計算式は、(rank − 1) / (total_rows − 1) である。 数式では、rankは現在の行のランクを表し、total_rowsはパーティション内の行の総数を表します。

構文

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

パラメーター

パラメーター

説明

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

戻り値のデータ型

ダブルタイプ。

各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

    から

  • クエリと分析結果 percent_rank

ランク関数

rank関数は、パーティション内の指定されたフィールドの各値のランクを計算します。 2つの値が同じ場合、同じランクが割り当てられます。 ランクは連続していません。 例えば、2つの値に同じランク1が割り当てられる場合、次のランクは3である。

構文

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

パラメーター

パラメーター

説明

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

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
  • クエリと分析結果 rank

row_number関数

row_number関数は、パーティション内の指定されたフィールドの各値のランクを計算します。 各値には一意のランクが割り当てられます。 ランクは1から始まります。

構文

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

パラメーター

パラメーター

説明

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

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
  • クエリと分析結果 row_number

first_value関数

first_value関数は、各パーティションの最初の行の指定されたフィールドの値を返します。

構文

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

パラメーター

パラメーター

説明

x

フィールド名。 このパラメーターの値は、任意のデータ型にすることができます。

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

フレーム

各パーティションのサブセットを指定します。 例: unbounded preceding and unbounded following

戻り値のデータ型

データ型は、xパラメーターのデータ型と同じです。

指定されたOSSバケット内の各オブジェクトの最小サイズを返します。

  • クエリ文

    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

    から

  • クエリと分析結果 first_value

last_value関数

last_value関数は、各パーティションの最後の行の指定されたフィールドの値を返します。

構文

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

パラメーター

パラメーター

説明

x

フィールド名。 このパラメーターの値は、任意のデータ型にすることができます。

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

フレーム

各パーティションのサブセットを指定します。 例: unbounded preceding and unbounded following

戻り値のデータ型

データ型は、xパラメーターのデータ型と同じです。

指定されたOSSバケット内の各オブジェクトの最大サイズを返します。

  • クエリ文

    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

    から

  • クエリと分析結果 last_value

ラグ関数

lag関数は、パーティションの現在の行の前の指定されたオフセットにある行の指定されたフィールドの値を返します。

構文

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

パラメーター

パラメーター

説明

x

フィールド名。 このパラメーターの値は、任意のデータ型にすることができます。

オフセット

パーティション内の現在の行の前のオフセット。 offsetパラメーターの値が0の場合、現在の行の指定されたフィールドの値が返されます。

default_value

現在の行の前の指定されたオフセットに行が存在しない場合、defaut_valueパラメーターの値が返されます。

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

フレーム

各パーティションのサブセットを指定します。 例: 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
      )
  • クエリと分析結果 窗口函数

リード関数

lead関数は、パーティションの現在の行の後の指定されたオフセットにある行の指定されたフィールドの値を返します。

構文

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

パラメーター

パラメーター

説明

x

フィールド名。 このパラメーターの値は、任意のデータ型にすることができます。

オフセット

パーティション内の現在の行の後のオフセット。 offsetパラメーターの値が0の場合、現在の行の指定されたフィールドの値が返されます。

default_value

現在の行の後の指定されたオフセットに行が存在しない場合、defaut_valueパラメーターの値が返されます。

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

フレーム

各パーティションのサブセットを指定します。 例: unbounded preceding and unbounded following

戻り値のデータ型

データ型は、xパラメーターのデータ型と同じです。

2021-08-26にウェブサイトへの1時間ごとのユニークビジター (UV) を数え、2時間連続の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
      )
  • クエリと分析結果 lead

nth_value関数

nth_value関数は、パーティションの先頭から指定されたオフセットにある行の指定されたフィールドの値を返します。

構文

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

パラメーター

パラメーター

説明

x

フィールド名。 このパラメーターの値は、任意のデータ型にすることができます。

オフセット

パーティションの先頭からのオフセット。

partition_expressionによるパーティション

partition_expressionパラメーターの値に基づいて行をパーティション分割する方法を指定します。

order_expressionによる注文

order_expressionパラメーターの値に基づいて、各パーティションの行の順序を指定します。

フレーム

各パーティションのサブセットを指定します。 例: unbounded preceding and unbounded following

戻り値のデータ型

データ型は、xパラメーターのデータ型と同じです。

各部門で2番目に給与が高い従業員を返します。

  • クエリ文

    * |
    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
  • クエリと分析結果 nth_value