Window関数についての知識をまとめた(その3)

## はじめに

データ分析における重要な関数そうなので、何章かに分けて、Window関数についてまとめています。

前回の記事は👇

https://qiita.com/ryosuketter/items/131b71b486ca7c2a7d54

今回は、演習問題を解いておきます。

今回もSQLの実行は 「DB Fiddle」というWebサービスを使ってみます。

https://www.db-fiddle.com/

## ServerLoadSample

サーバの負荷量のテーブルがあるとします。
このテーブルに対して書くSQLの出力結果を予測しましょう。

| server | date       | load_val |
|--------|------------|----------|
| A      | 2021-08-01 | 10       |
| A      | 2021-08-02 | 20       |
| A      | 2021-08-03 | 30       |
| B      | 2021-08-01 | 100      |
| B      | 2021-08-02 | 200      |
| B      | 2021-08-03 | 300      |
| C      | 2021-08-01 | 1000     |
| C      | 2021-08-02 | 2000     |
| C      | 2021-08-03 | 3000     |


load_val: 負荷量

## 演習問題1

Schema (MySQL v8.0)

```sql

    CREATE TABLE serverLoadSamples (
      id INT NOT NULL PRIMARY KEY auto_increment,
      server TEXT,
      date DATE,
      load_val FLOAT
    );
    
    INSERT INTO serverLoadSamples VALUES
        (1, 'A', '2021-08-01', 10),
        (2, 'A', '2021-08-02', 20),
        (3, 'A', '2021-08-03', 30),
        (4, 'B', '2021-08-01', 100),
        (5, 'B', '2021-08-02', 200),
        (6, 'B', '2021-08-03', 300),
        (7, 'C', '2021-08-01', 1000),
        (8, 'C', '2021-08-02', 2000),
        (9, 'C', '2021-08-03', 3000);

```

Query

```sql
    SELECT
       server,
       date,
       SUM(load_val) OVER() AS sum_load
    FROM serverLoadSamples;

```

出力結果を予測できますか？

Results

| server | date       | sum_load |
| ------ | ---------- | -------- |
| A      | 2021-08-01 | 6660     |
| A      | 2021-08-02 | 6660     |
| A      | 2021-08-03 | 6660     |
| B      | 2021-08-01 | 6660     |
| B      | 2021-08-02 | 6660     |
| B      | 2021-08-03 | 6660     |
| C      | 2021-08-01 | 6660     |
| C      | 2021-08-02 | 6660     |
| C      | 2021-08-03 | 6660     |

PARTITION BY 句がないため、ウィンドウ全体がパーティションになります。

ORDER BY もないので、パーティションに対して集約関数が適応されました。

https://www.db-fiddle.com/f/MzmHGaiYv7MnYkyFE2XrW/0

## 演習問題2

Schema (MySQL v8.0)

```sql

    CREATE TABLE serverLoadSamples (
      id INT NOT NULL PRIMARY KEY auto_increment,
      server TEXT,
      date DATE,
      load_val FLOAT
    );
    
    INSERT INTO serverLoadSamples VALUES
        (1, 'A', '2021-08-01', 10),
        (2, 'A', '2021-08-02', 20),
        (3, 'A', '2021-08-03', 30),
        (4, 'B', '2021-08-01', 100),
        (5, 'B', '2021-08-02', 200),
        (6, 'B', '2021-08-03', 300),
        (7, 'C', '2021-08-01', 1000),
        (8, 'C', '2021-08-02', 2000),
        (9, 'C', '2021-08-03', 3000);

```

Query

```sql
    SELECT
    	server,
       date,
       SUM(load_val) OVER(PARTITION BY server) AS sum_load
    FROM serverLoadSamples;
```

出力結果を予測できますか？

Results

| server | date       | sum_load |
| ------ | ---------- | -------- |
| A      | 2021-08-01 | 60       |
| A      | 2021-08-02 | 60       |
| A      | 2021-08-03 | 60       |
| B      | 2021-08-01 | 600      |
| B      | 2021-08-02 | 600      |
| B      | 2021-08-03 | 600      |
| C      | 2021-08-01 | 6000     |
| C      | 2021-08-02 | 6000     |
| C      | 2021-08-03 | 6000     |

- PARTITION BY 句が追加され、serverごとにパーティションが区切られた
    - その範囲でSUMされている
- ORDER BY はないので、serverごとのパーティションに対して集約関数が適応されます

https://www.db-fiddle.com/f/tvBj6iTmNopjaTKXozYEk6/0

## 参照

https://www.amazon.co.jp/dp/4798157821/

42 - 43p 

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103