毎日実行されるワークフローに、日曜日にのみ全量洗い替え更新が実行されるクエリを組み込む

troccoというETLツールにて、毎日実行されるワークフローの中に、
日曜日のみに全量洗い替え更新が実行されるクエリを組み込んだ。
このように実装することで、ワークフローは毎日実行されるが、下記クエリのジョブだけは日曜日だけ処理が走る。

## 使用クエリ例
```SQL
begin transaction;

/* 日付関連UDF */
create temp function yesterday() as (
    date('$yesterday_%Y-%m-%d$') -- $yesterday_%Y-%m-%d$は前日を表す変数
);
create temp function today() as (
    date('$today_%Y-%m-%d$') -- $today_%Y-%m-%d$は今日を表す変数
);

/* TEMPテーブルを作成 */
create temp table 一時テーブル名 as 
select
    *
from
    `データ抽出するテーブル名`
where
    1=1
    and extract(dayofweek from today()) = 1 --日曜日のみ実行されるように条件設定
;

/* 冪等性担保のために、該当日付のデータ削除後に実行する。*/
delete
from
    `データ追加先のテーブル名`
where
    1=1
    and extract(dayofweek from date today()) = 1 -- 日曜日のみに実行されるように条件設定
;

/* 最後にTEMPテーブルの内容をINSERT */
INSERT `データ追加先のテーブル名`
select 
    *
from
    一時テーブル名
where
    1=1
    and extract(dayofweek from today()) = 1 -- 日曜日のみ実行されるように条件設定
;

/* TEMPテーブルを削除しておく */
drop table 一次テーブル名;

commit transaction;
```

## クエリの解説
### **troccoのカスタム変数の設定**
└`$yesterday_%Y-%m-%d$`のデータ型を「時刻・日付（実行時）」。
└`$today_%Y-%m-%d$`のデータ型を「時刻・日付（キューイング時）」に設定をしている。
※「キューイング時」は、転送を行う際に指定した日時がカスタム変数に代入され、「実行時」はワークフローが実際に実行された日時がカスタム変数に代入されるイメージ。
例えば、上記のクエリで、3日前に遡ってワークフローを実行すると、`$today_%Y-%m-%d$`には実行日の3日前の日付が代入され、`$yesterday_%Y-%m-%d$`には実行時の1日前の日付が代入される。

### **TEMPテーブル**
WHERE句に日曜日のみに実行`（extract(dayofweek from today()) = 1）`の条件を追加
これによって、日付を遡ってジョブを再実行する場合でも、「日曜日のみ実行」された場合のみ処理が走るようになっている。
上記でも書いた通り、`$yesterday_%Y-%m-%d$`カスタム変数は実行タイミングでの日時が入るため、日付を指定しても実行した日時の日付として処理される。

### **CREATE OR REPLACEを使用せず、DELETE文とINSERT文を使用して全量洗い替え更新を行っている**
つtroccoというETLツールにて、毎日実行されるワークフローの中に、
日曜日のみに全量洗い替え更新が実行されるクエリを組み込んだ。

## 使用クエリ例
```SQL
begin transaction;

/* 日付関連UDF */
create temp function yesterday() as (
    date('$yesterday_%Y-%m-%d$') -- $yesterday_%Y-%m-%d$は前日を表す変数
);
create temp function today() as (
    date('$today_%Y-%m-%d$') -- $today_%Y-%m-%d$は今日を表す変数
);

/* TEMPテーブルを作成 */
create temp table 一時テーブル名 as 
with master as (
    select
        *
    from 
        `データを抽出するテーブル名`
    where
        publish_begin_date_jst <= '$yesterday_%Y-%m-%d$' -- 昨日以前に公開開始したコンテンツに絞り込む 
)
select
    *
from
    `データ抽出するテーブル名`
where
    1=1
    and extract(dayofweek from today()) = 1 --日曜日のみ実行されるように条件設定
;

/* 冪等性担保のために、該当日付のデータ削除後に実行する。*/
delete
from
    `データ追加先のテーブル名`
where
    1=1
    and extract(dayofweek from date today()) = 1 -- 日曜日のみに実行されるように条件設定
;

/* 最後にTEMPテーブルの内容をINSERT */
INSERT `データ追加先のテーブル名`
select 
    *
from
    一時テーブル名
where
    1=1
    and extract(dayofweek from today()) = 1 -- 日曜日のみ実行されるように条件設定
;

/* TEMPテーブルを削除しておく */
drop table 一次テーブル名;

commit transaction;
```

## クエリの解説
### **troccoのカスタム変数の設定**
└`$yesterday_%Y-%m-%d$`のデータ型を「時刻・日付（実行時）」。
└`$today_%Y-%m-%d$`のデータ型を「時刻・日付（キューイング時）」に設定をしている。

※「キューイング時」は、転送を行う際に指定した日時がカスタム変数に代入され、「実行時」はワークフローが実際に実行された日時がカスタム変数に代入されるイメージ。
例えば、上記のクエリで、3日前に遡ってワークフローを実行すると、`$today_%Y-%m-%d$`には実行日の3日前の日付が代入され、`$yesterday_%Y-%m-%d$`には実行時の1日前の日付が代入される。
※引用：[カスタム変数について（troccoヘルプ）](https://documents.trocco.io/docs/custom-variables?highlight=%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0)

### **TEMPテーブル**
WHERE句に日曜日のみに実行`（extract(dayofweek from today()) = 1）`の条件を追加
これによって、日付を遡ってジョブを再実行する場合でも、「日曜日のみ実行」された場合のみ処理が走るようになっている。
上記でも書いた通り、`$yesterday_%Y-%m-%d$`カスタム変数は実行タイミングでの日時が入るため、日付を指定しても実行した日時の日付として処理される。

### **CREATE OR REPLACEを使用せず、DELETE文とINSERT文を使用して全量洗い替え更新を行っている**
通常、全量洗い替えは`create or replace table`で行うが、
ここではDELETE文とINSERT文で表現している。

理由は、**transaction処理を使いたい**から。
`create or repace table`はtransaction処理の中で使用することができないので、transaction処理を使いながら全量洗い替え更新をしたい場合は、
上記クエリのようにDELETE文とINSERT文を使用して表現した方が良い。