🔖

AthenaのWINDOW関数調査

2020/12/12に公開

なんだかんだ分析やっておきながらSQLはSELECT,JOINあたりしかやっていなかったので、急いて回収せねばと思いやってみました。過去記事で作成できるAthena環境を使用します
https://zenn.dev/yassh_i/articles/bbdab0f80fdfd8

ウィンドウ関数とは

Presto documentationにはこう書いてありました。

ウィンドウ関数はクエリ結果の行全てに計算を行う関数。HAVING句の後ろにあり、ORDER BY句よりは前にないといけません。ウィンドウ関数は呼び出し時にOVER句を使って特別な指定を行う必要がある。

ウィンドウの持つ機能

  1. The partition specification
    GROUP BY句が、集計関数のために行を異なるグループに分けれるように、インプットされる行を異なるパーティションに分けることができる。

  2. The ordering specification
    どの行がウィンドウ関数に処理されるかを定義できる

  3. The window frame
    与えられた行何行ごとにその関数を実行するかを指定できる。なにも指定しないと、パーティションのはじめからおわりまで、となる

以下Prestoでできるとは確認できていませんが、、、
行の指標は、ROWS(行)、GROUPSとかの単位で指定できたり、、、?(もしご存知の方おりましたら、参考になる記事など紹介していただきたい。難しい、、、)

原文は以下です。
Window functions perform calculations across rows of the query result. They run after the HAVING clause but before the ORDER BY clause. Invoking a window function requires special syntax using the OVER clause to specify the window.
A window has three components:

  • The partition specification, which separates the input rows into different partitions. This is analogous to how the GROUP BY clause separates rows into different groups for aggregate functions.
  • The ordering specification, which determines the order in which input rows will be processed by the window function.
  • The window frame, which specifies a sliding window of rows to be processed by the function for a given row. If the frame is not specified, it defaults to RANGE UNBOUNDED PRECEDING, which is the same as RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. This frame contains all rows from the start of the partition up to the last peer of the current row.

https://prestodb.io/docs/0.172/functions/window.html

追記 2020/12/13

GROUP BY句との違い

GROUP BY句は、定義したグループごとに、SELECT句にある集計関数を実行し、行をグループごとにしてしまいますが、ウィンドウ関数を使用すると、個々の行を残したまま、集計作業を行うことができます。

以下の記事でAthenaでサンプルを載せています
https://zenn.dev/yassh_i/articles/4692f13276f4b6

Discussion