アクションテーブルにデータを格納すると、KARTE/KARTE TALKの接客サービスからリアルタイムにデータを参照することができます。
本ページではそのやり方についてサンプルを使って説明します。
サンプルケース
- 商品の購入数ランキングを週次で集計し、そのランキング結果を接客サービスとしてサイト上に表示したい
設定手順(例)
商品マスタデータを準備する
まず、商品のマスタ情報を準備します。
今回の例では、以下のフォーマットのCSVファイルを用意します。
フィールド名 | 型 |
---|---|
item_id | STRING |
name | STRING |
image | STRING |
url | STRING |
- 注意点
- ※ buyイベントで計測している
item_id
とcsvファイルのitem_id
が一致している必要があります
- ※ buyイベントで計測している
テーブルを作成する
- グローバルメニューから[Datahub > データセット]画面を開きます
- [作成 > データセットを作成]から、サンプルデータを格納するデータセットを新規作成します
- データセット名:
item_master_test
- ※別の名前を設定した場合は、後述するクエリの中のデータセット名も合わせて変更して下さい
- データセット名:
- 作成したデータセットを開き、[テーブルを作成] からテーブルを新規作成します
- テーブル名:
item_master
- ※別の名前を設定した場合は、後述するクエリの中のテーブル名も合わせて変更して下さい
- スキーマを指定して作成: チェックを付ける
- スキーマ(テキスト):
item_id:STRING,name:STRING,image:STRING,url:STRING
- テーブル名:
データセットにデータをインポートする
- 作成したテーブルをクリック
- csvファイルからインポートを選択し、csvファイルをアップロード
ランキングデータ抽出用のクエリを書く
KARTEのタグで取得した購入イベントデータとデータテーブルにインポートした商品のマスタデータを用いて、ランキングデータ集計用のクエリを書いていきます。
- グローバルメニュー > Datahub > クエリ画面から「作成」→「クエリを作成」をクリック
- 「SQLエディタ]に下記を入力
WITH analysis_data AS (
SELECT
user_id
, JSON_QUERY(VALUES, '$.buy.items') AS items
FROM {% karte_event period[0], period[1] %}
WHERE
event_name = 'buy'
AND JSON_QUERY(VALUES, '$.buy.items') IS NOT NULL
)
, convert_to_array AS (
SELECT
user_id
, SPLIT(SUBSTR(items, 2 , LENGTH(items) - 2), '},{') AS items
FROM
analysis_data
)
, unnested AS (
SELECT
user_id
, item
FROM
convert_to_array, UNNEST(items) AS item
)
, restored_to_json AS (
SELECT
user_id
, CONCAT('{', REPLACE(REPLACE(item, '{', ''), '}', ''), '}') AS item
FROM
unnested
)
, dataset AS (
SELECT
JSON_VALUE(item, '$.item_id') AS item_id
, JSON_VALUE(item, '$.quantity') AS quantity
FROM
restored_to_json
)
, aggregate_data AS (
SELECT
item_id
, SUM(CAST(quantity AS INT64)) AS sum_quantity
, COUNT(*) AS cv_count
FROM
dataset
GROUP BY
item_id
)
, item_master AS (
SELECT
item_id
, name
, image
, url
FROM `prd-karte-per-client.item_master_test_{{api_key|safe_param}}.item_master` --データセット名およびテーブル名は必要に応じて書き換えて下さい
)
SELECT
a.item_id
, i.name
, i.image
, i.url
, RANK() OVER (ORDER BY a.sum_quantity DESC) AS ranking
, a.sum_quantity AS cv_count
FROM aggregate_data AS a
INNER JOIN item_master AS i
ON a.item_id = i.item_id
ORDER BY ranking
- [パラメータエディタ]に下記を入力
period:
type: period
label: 抽出期間
default: past 7 day
- クエリ名を「商品ランキングデータ抽出」として保存
- クエリを実行し、問題なく結果が返ってくることを確認
アクションテーブルを作成する
- グローバルメニュー > アクション > アクションテーブル画面右上の「作成」→「空のテーブルを作成」をクリック
- 以下の設定を行います
- テーブル名:任意の名前を入力
- 今回は
ranking_weekly
としています
- 今回は
- スキーマ設定:上記クエリ結果のスキーマを指定
- 権限:今回は参照のみなので「ウィジェットからの参照」にチェック
- テーブル名:任意の名前を入力
アクションテーブルにクエリ結果を移行する
- グローバルメニュー > データハブ > ジョブフロー画面右上の「作成」をクリック
- ジョブ設定画面から以下を設定し、右上の「保存して完了」をクリック
- ジョブの設定
- ジョブ名:任意の名前を入力
- 今回は「商品ランキングをアクションテーブルへ」
- ジョブタイプ:データテーブルからエクスポート
- エクスポート元:上記で作成したクエリ名を選択
- エクスポート先:先程作成したアクションテーブルを選択
- ジョブ名:任意の名前を入力
- 実行方法を選択
- 今回の例では週次でランキングデータを更新したいので、「繰り返し実行を有効にする」にチェックを入れ、実行頻度を「1週ごと」に設定
- ジョブフローの設定
- ジョブ実行後に対象のジョブをアーカイブしたい場合には「ジョブ実行終了後にアーカイブ」にチェックを入れます
- ジョブフロー名:任意の名前を入力
- ジョブの設定
アクションテーブルクエリを作成する
接客サービスからアクションテーブルのデータを取得するには以下の2種類の方法があります。
- 主キーを指定してレコード取得する
- アクションテーブルクエリを使ってレコード取得する
今回の場合はランキング上位のものを表示したいので、主キーの指定ではなくアクションテーブルクエリから参照する必要があります。
- 参照したいアクションテーブルを選択し、画面右の「作成」をクリック
- 以下の設定を行い、完了をクリック
- クエリ名:任意ですが、今回は
find_all
と設定 - 抽出条件:今回の例ではランキングの上位3件のレコードを抽出したいので、以下の条件で設定します。
- Limit:3
- Sort:
ranking
昇順
- クエリ名:任意ですが、今回は
これでアクションテーブルクエリの作成は完了です。
接客サービスからデータを参照する
- 接客サービス作成画面に遷移して「新規作成」
- 今回は「Image List vertical 0」のテンプレートを利用しています
- ユーザーに見せる -> 画像付きリスト(縦) -> Image List vertical 03
- 今回は「Image List vertical 0」のテンプレートを利用しています
- 接客サービス編集画面 -> カスタマイズ -> Script から以下のスクリプトを記載してアクションテーブルのデータを取得します。
var table = widget.collection('v2/ranking_weekly');
table.getByQuery('find_all', {}, function(err, items){
widget.setVal('items', items);
widget.show();
});
詳細は以下のドキュメントをご確認ください
html側からは以下のようにして呼び出します。(対象の部分のみ記載しています。)
<!-- リンクリスト -->
<ul class="card-list _fit-card list-link">
<li krt-for="item in items">
<a krt-bind:href="item.url">
<div class="rank-num">{{item.ranking}}位</div>
<figure class="link-image radius-circle"
style="width:46px"
>
<img krt-bind:src="item.image" alt="">
</figure>
<div class="link-body">
<h2 class="link-heading">{{item.name}}</h2>
</div>
<i class="link-arrow #{iconArrowRight}" aria-hidden="true"></i>
</a>
</li>
</ul>
- こちらも詳細は以下のドキュメントをご確認ください。
このような形で表示することが可能です。
設定は以上で完了になります。
あとは従来の接客サービスと同じフローで配信設定を行ってください。