Oracle Analytics Cloud：時系列関数で前期間のデータを検索する

# はじめに
Oracle Analytics Cloud（**OAC**）には時系列関数が備わっており、特殊な時系列計算を簡単に実施できるようになっています。
従来は、セマンティック・モデルとして定義されたサブジェクト領域をデータソースとした時のみ、サポートされていました。
現在（2024年3月）では、時系列データを含むデータセットでも使用可能になっています。

こちらのチュートリアルで入手できる、Sample_order_lines.xlsx をデータセットとして登録し、時系列関数を試してみます。

https://docs.oracle.com/en/cloud/paas/analytics-cloud/tutorial-auto-insights/index.html#before_you_begin

# 1. 時系列関数
時系列関数とは、時系列データに基づいて集計や予測をするためのOACの組み込み関数です。
この記事では、集計のための3つの関数を紹介します。

## 1.1 Ago
指定した時間間隔（*Time_Level*）で指定した期間（*Offset*）だけ遡ったメジャー列を集計します。

```sql
AGO(<<Measure>>, <<Time_Level>>, <<Offset>>)
```

**Measure**は、集計する列です。
**Time_Level**に指定できるのは、Year, Quarter, Month, Week, Day のいずれかです。
**Offset**には、何期間遡るかを指定します。
Time_Level が Year で、Offset が 1の場合は 1年前を意味します。

AGO(Sales, Year, 1)
とすると、1年前のSales列の値を集計します。

## 1.2 PeriodRolling
現在時間を基準にして、x期間前からy期間後までのメジャー列の値を集計します。

```sql
PERIODROLLING(<<Measure>>, x ,y)
```

PERIODROLLING(measure, -2, 0)
とすると、-2期間前から現在期間（現在は0）まで measure を集計します。
（-2, -1, 0 の3期間分となります）
時間単位は、検索に含まれる最も詳細な時間要素によって決定されます。
例えば、検索に含まれる時間要素が「年」だけの場合は今年を含む直近3年を意味し、「月」が含まれる場合は今月を含む直近3ヶ月を意味します。

## 1.3 ToDate
ある期間の開始時点から最新の期間までのメジャー列の値を集計します。

```sql
TODATE(<<Measure>>, <<Time_Level>>)
```
**Measure**は、集計する列です。
**Time_Level**に指定できるのは、Year, Quarter, Month, Week, Day のいずれかです。

TODATE(Sales, Month)
とすると、Sales列を月ごとに累計します。検索には「月」を含める必要があります。
年や四半期など同時に検索される上位の時間単位が変わると、累計した値がリセットされます。

# 2. ワークブックで使用してみる
実際に試します。
Sales Order Linesデータセットを使って、新しいワークブックを作成します。
「計算の作成」で新しい計算を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/092ba7b6-fcf5-5cb9-9a27-cb3401b14dc3.png)

## 2.1 過去の指定した期間の集計（AGO関数）
関数の検索ボックスに「ago」を入力すると、時系列計算の関数として「Ago」がヒットします。
「Ago」をダブルクリックすると、式エディタに挿入されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b33ddbb0-07d3-d39b-841d-8ee3c0745948.png)

名前を「前年売上」とします。
式は
```sql
AGO(Sales, Year, 1)
```
とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5efdcd89-9e74-6518-af38-9cfe1c28e61f.png)

「Sales」列と「Order Date」列を展開して「年」列、今作成した「前年売上」をCtrlキーを押しながら同時に選択し、右クリックします。
「ビジュアライゼーションの選択」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/22cbf0a2-d4fb-440f-2f84-9b15f4f4bbca.png)

「表」ビジュアライゼーションをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7f398be6-09b5-53fa-9473-7ef8f65ab3d3.png)

「前年売上」に、1年前の値が表示されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/5aaf7304-1f42-1d4c-05bc-061cb565a437.png)

## 2.2 指定した期間の移動集計（PERIODROLLING関数）
先程の表ビジュアライゼーションに「四半期」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/70d13d9e-c436-08ec-120e-c751c6110a2a.png)

PERIODROLLING関数で売上の移動平均を求めます。

新たに計算を追加します。
名前は「Sales移動平均（3期間）」にします。
式は
```sql
PERIODROLLING(Sales, -2, 0)/3
```
とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/20caff97-801b-c381-cf60-c5b59123cdc3.png)

開始期間を -2 としたので、現在期間を 0 として2期間遡ることになります。（つまり3期間分集計します）
2期間前から現在期間まで集計された Sales列の値を（期間数である）3で割ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d0f68fc4-6aad-3b2b-a2d7-2dc902a36e90.png)

## 2.3 指定した期間の累計（TODATE関数）
Salesの年累計を求めます。年が変わると累計した値はリセットするものとします。

新たな計算を追加します。
名前は「Sales YTD」にして、式は
```sql
TODATE(Sales, Year)
```
とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1a7a286f-d711-2acc-0224-d867aa1f909d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/27577ec4-f8ff-e671-db14-4de693027ada.png)

# 3. ドキュメント
https://docs.oracle.com/en/cloud/paas/analytics-cloud/acubi/functions.html#GUID-85E0FDF7-BF01-49CB-BAE0-55A19BA33737

# 4. その他の方法
- [Oracle Analytics Cloud：前年の値を計算](https://qiita.com/tyo38/items/71de5c655ce0b17fd5a0)
- [Oracle Analytics Cloud：Ago関数で過去のデータを検索する](https://qiita.com/tyo38/items/8135b9a6251ba5417e1c)