BIツールでおなじみのドリルダウン。
大分類ごとの売上 → 大分類・中分類ごとの売上 → 大分類・中分類・小分類ごとの売上 のようにどんどんと細かい情報にしてデータ分析をする方法です。
この機能を使いたいのにデータが階層ごとになっていないからうまくできない、ということはございませんか?
この記事ではカラム内の文字列の中で特定の文字列で分割して、階層項目をつくるという内容です。
便利な技術なのでぜひご覧になってください。
階層テーブルでドリルダウンをする
このドリルダウンはホームページのURLを階層にして表示させています。pagePath1 → pagePath2 → pagePath3 と詳細にドリルダウンしていますね。
このドリルダウンを実現するためにはpagePath1、pagePath2、pagePath3という項目が必要です。
ひとつの項目にフルパスが入っている場合が多い
しかしこのように階層構造となっているテーブルはなかなかなく、下図のように1つの項目にフルパスで入っていることが多いです。
Page URLはスラッシュ(/)で区切られています。こちらをpagePath1、pagePath2・・・のように分解していきます。
それではデータを加工していきましょう。
今回はDS Scriptをつかってデータを加工します。
SQLで同様の処理を実現したい場合は、SQL編の記事をご参照ください。
元となるテーブル
今回のサンプルとなるテーブルはこちらです。[アクセスログ]というテーブルにしています。
こちらは[アクセスログb]というテーブルです。階層数とpagePath1~pagePath10までの項目があります。
こちらのテーブルにデータを入れます。つまり[アクセスログ]のデータを参照・加工して[アクセスログb]に挿入します。
もしひとつのテーブルの中で加工+更新をしたいのであれば
[アクセスログb]テーブルにPageURLとpageViewのデータが入っていて、UPDATEを使ってpagePath1からpagePath10の項目に更新をかける場合は以下の記事を参照ください。
DS Scriptをつかってデータ加工をする
今回使用するスクリプトはこちらです。
SET() {
// 区切り文字
$CONST_SEPARATOR := "/";
// データベース名(引数が未指定の場合の値を指定)
$VAR_DB_NAME := "work";
// エクスポート元テーブル名(引数が未指定の場合の値を指定)
$VAR_SRC_TABLE_NAME := "アクセスログ";
// エクスポート先テーブル名(引数が未指定の場合の値を指定)
$VAR_DEST_TABLE_NAME := "アクセスログb";
}
CONNECT($VAR_DB_NAME) {
}
EXPORT($ENV_CURRENT_DB,
$VAR_DEST_TABLE_NAME,
$_EXPORT_MODE_TRUNCATE,
$_ERROR_MODE_INTERRUPTED,
$_TABLE_CREATE_MODE_NORMAL) {
SELECT
PageURL,
LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) 階層数,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 1 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 2)
ELSE ''
END pagePath1,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 2 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 3)
ELSE ''
END pagePath2,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 3 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 4)
ELSE ''
END pagePath3,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 4 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 5)
ELSE ''
END pagePath4,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 5 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 6)
ELSE ''
END pagePath5,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 6 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 7)
ELSE ''
END pagePath6,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 7 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 8)
ELSE ''
END pagePath7,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 8 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 9)
ELSE ''
END pagePath8,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 9 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 10)
ELSE ''
END pagePath9,
CASE WHEN LENGTH(PageURL) - LENGTH(REPLACE(PageURL, '${CONST_SEPARATOR}', '')) >= 10 THEN '${CONST_SEPARATOR}' || SPLIT_PART(PageURL, '${CONST_SEPARATOR}', 11)
ELSE ''
END pagePath10,
pageView
FROM ${VAR_SRC_TABLE_NAME};
}
実際のサンプルプログラムはこちらからダウンロードできます。
上記のスクリプトを流すと、[アクセスログb]に以下のようにデータが入ります。
ちゃんと階層構造になりましたね。
この状態になればドリルダウンをすることが可能です。
ダウンロードしたdhnファイルを自社の環境に適用する方法
dhnファイルをダウンロードしたら、ファイルを開いて5行目と7行目と9行目のデータベース名とテーブル名を自社の環境のデータベースとテーブルに変更します。
そしてScript Editorを開き、左下のスクリプトファイルを右クリックし[アップロード]から該当のdhnファイルを取り込みます。
[実行]をしてみて、エラーが出ないことを確認したら、dhnファイルを保存しましょう。
これで自社環境でサンプルスクリプトを使用することができます。
DS Scriptをバッチから呼び出して自動化しよう
バッチでdhnファイルを呼び出し、DS Scriptを動かしましょう。
DS Scriptのバッチからの起動方法についてはこちらの記事を参照してください。
BIツールのパフォーマンスを最大限に活かすには、元データを使いやすい形に加工することも重要です。
SQLを理解して、データ加工の技術を身に着けていきましょう。