Adobe Campaignクエリー道場(3)〜最新日付でビバノンノン

Adobe Campaignクエラーのみなさん、今日も元気にクエってますか。

さっそく今日のお題です。Campaignの受信者には、これまでに何度も配信を送っていることでしょう。では、そのアドレスごとに、いちばん最近で送ったのがいつか。それを調べたい！
なるほど。施策ごとに条件を考えてターゲットを選んでるはずですが、結果として最近あんまりリーチできてないな、なんて受信者もいるかもしれませんね。Campaignマーケターとしては気になるところかと思います。
クエり甲斐あるお題です。やってみましょう！

まずクエリー対象ディメンジョン。配信の実績を見たいのですから、受信者配信ログを選びます:
![2022-11-01_16-16-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/f7a1acbf-a600-7656-fcd8-0708ef51ea14.png)
フィルター条件。配信が成功しているものに関心があるので、ステータスが送信済みであるものを抽出しましょう:
![2022-11-01_16-21-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/b64f10b7-0a07-4620-9520-7c0a4c6f005a.png)
「クエリ」画面に戻ったら「補足情報」の「データを追加...」をクリック:
![2022-11-01_16-23-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/a985c341-e52c-dc82-65ba-25ed7822cabb.png)
「フィルタリングディメンジョンにリンクされたデータ」>「フィルタリングディメンジョンのデータ」:
![2022-09-28_15-14-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/3b88669c-99f7-bd16-b367-6b30608ca776.png)
![2022-09-28_15-15-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/2507ae1d-a185-5dc2-279a-e46654310d91.png)
「追加するデータ」画面の「使用可能フィールド」で「アドレス」をダブルクリックして「出力列」に追加します:
![2022-11-18_15-03-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/144f3992-3774-bcc8-bcd8-34c1fb2ebe71.png)
ここまでは[前々回](https://qiita.com/JJSlider/items/dff8bb8a8c48ddad40bf "Adobe Campaignクエリー道場(1)〜ユニークな件数")とおおよそ同じなので、迷われた方は併せてご参照くださいね。で、ポイントはここから。「使用可能フィールド」の「イベントの日付」をダブルクリックして「出力列」に追加します:
![2022-11-18_15-06-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/1665f1e1-cbe6-91ae-2ab1-ac5b35e029f9.png)
配信がいつかを問うているので、受信者配信ログの「イベントの日付」を見ようというわけです。しかし単なる配信時刻ではなく、アドレスに対し「いちばん最近」配信したときを知りたいのでした。
そこで「イベントの日付」行の「式」をクリックしましょう。すると入力フィールドになり「＠eventDate」と表示されます:
![2022-11-18_15-11-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/21725fe2-ac34-f862-9279-01856999cf16.png)
そこに「Max(＠eventDate)」と手入力してください:
![2022-11-18_15-14-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/e4f12aef-8e4b-580e-183b-dbed6bca1eda.png)
Enterすると「最大 イベントの日付」と表示が変化します:
![2022-11-18_15-17-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/716da1d6-abee-52fc-adde-8e43c10bb95b.png)
ここで入力した「Max()」は前々回・[前回](https://qiita.com/JJSlider/items/da6b567d13adb5f5500a "Adobe Campaignクエリー道場(2)〜重複値を探す")と続けて紹介している「集計関数」のひとつ。最大値を得る関数です。「いちばん最近」の日付を知りたいので、「イベントの日付」の最大値を取ったのでした。
でも最大というからには、何のなかで最大なのかが問題ですよね。この場合、あるアドレスへ送られた配信のなかで日付が最大値のものが知りたい。つまりアドレスごとに「集計」したいのです。
というわけで、「出力列」の「アドレス」行にある「グループ」のチェックボックスをチェックして「はい」にします:
![2022-11-18_15-25-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/405e3cee-6b9e-a8b1-b247-3aec2ce5b369.png)
これが前回も使用したグループ化。アドレスごとにデータを束ね、そのなかでの最大値つまり「いちばん最近」の日付を得るというわけです。
あとは忘れずに最後の仕上げをします。「完了」で「クエリ」画面に戻り、「追加データを編集...」をクリック:
![2022-11-18_15-29-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/17bd45ce-063b-9dfa-a0fc-6a6cadfd6e6f.png)
「詳細設定パラメーター...」をクリック:
![2022-11-18_15-35-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/5c929c4d-bad8-3bce-5f19-bbda5245b259.png)
「重複行を削除(DISTINCT)」をアンチェック、「ターゲティングディメンジョンのプライマリキーの自動追加を無効にする」をチェック。このへんは前々回・前回といっしょです:
![2022-11-18_15-53-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/d884ae9f-2a88-5c9f-162f-cfc9379167ec.png)
「OK」を続けてダイアログを閉じていきワークフローキャンバスに戻って完成！
今回も一時的[^1]にワークフロープロパティで「2つの実行間の中間母集団の結果を保持」にして結果を見てみます。「クエリ」からの遷移矢印を右クリック→「ターゲットを表示...」を選択して「最大 イベントの日付」を繰り返しクリック:
![2022-11-25_10-46-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/b45d128e-06e1-6d69-9c6d-c7caea8b890a.png)
「▲」が表示されると昇順ソートになります:
![2022-11-25_10-52-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/221a462b-e6a4-c8c6-1093-362ff916cc69.png)
...という感じで、アドレスごとに「いちばん最近」配信された日付を古い方から見ることができました。施策の向上に使えそうですね！

今回もいちおう、バックエンドで実行される生SQLを見てみましょう:
```
SELECT   Max(B0.tsEvent), B0.sAddress FROM NmsBroadLogRcp B0 WHERE (B0.iStatus = 1) AND ((B0.iBroadLogId > 0 OR B0.iBroadLogId < 0)) GROUP BY B0.sAddress
```
細かいところはいいとして、注目なのは「Max(B0.tsEvent)」「GROUP BY B0.sAddress」です。前者は手入力した集計関数Maxですね。後者は「グループ」のチェックボックスをチェックしたことによるグループ化。対応するSQLがこの「GROUP BY」です。このように集計関数は原則、グループ化とセットで考えてください[^2]。

最大値・最小値を知りたいというニーズはほんとにしょっちゅう出てくるんじゃないでしょうか。今回の「いちばん最近」という要件も、まさに日付の最大値として得られるものでした。そんなときは本稿のように、集計関数＋グループ化で瞬殺してしまいましょう！

では──ここまでの知識を踏まえて、応用編にトライしてみませんか。
初めてCampaignからのメールを受け取ったのが特定の日付(たとえば2022年4月1日)以降であるアドレスと、その初回受信日時とを抽出してください。
このシリーズ「Adobe Campaignクエリー道場」をお読みになっていれば余裕のクエリーだと思います。宿題にしますので、次回までに考えておいてくださいね。
宿題やったか！　歯みがけよ！　風邪ひくなよ！　また来週〜！[^3]

::: note warn
本稿の内容は筆者のオンプレミス型デモ環境(Adobe Campaign Classic 9342@6583a8a・PostgreSQL 11.14)上で実施した検証に基づきます。別環境における同様の動作を保証するものではありません。またデータは架空のものであり、既存の配信や実在の組織とはいっさい関係がありません。
:::
[^1]: 本シリーズでは繰り返し注意していますが、「2つの実行間の中間母集団の結果を保持」は検証環境などだけであくまで一時的に有効化するものです。本番環境ではやらないようにお願いします。
[^2]: 前々回で紹介した「Countdistinct()」などは「GROUP BY」がなくても動作しますが、count系以外の「Max()」などはグループ化がないとCampaignがそもそもエラーになります。RDBへ直接SQLを発行する場合でも、「GROUP BY」を伴わない「Max()」をエラーとするRDBが多いようです。
[^3]: これがわかったあなたは同世代。