Qlik Trainingブログ

  • Qlik Cloud
  • Qlik Sense
  • QlikView
  • 開発者
  • データロード
2025.01.22

先行ロードを使用してスクリプトを短くまとめよう!

Qlik Sense を使っている皆さん、こんにちは!

皆さんは「先行ロード」についてご存知でしょうか。
先行ロードとは、通常指定するFrom句やResident句などのソース修飾子を指定せずに、直下に記載されたLOAD文またはSELECT文からロードする方法です。
先行ロードの機能を使用すると、すぐ下に記載されたLOAD文の結果をデータソースとして、上のLOAD文で使用することができます。

先行ロードを使用することで、From句やResident句を記載せずにデータの読み込みができるほか、Resident句を使用するよりもデータの読み込みが速くなることがあります。

今回は「先行ロード」の活用例について、ご紹介します!

目次

※本記事は「2024年12月時点のQlik Sense SaaS」で作成しています。

先行ロードの特徴と注意点

特徴
・From句やResident句などのソース修飾子を指定せずに実行します。
 ※「Resident句」とは、既にQlikでロードしたテーブルからデータをロードできる機能です。

・メーカーヘルプによると、「Resident句を使用しても同じ結果が得られるが、通常は先行ロードの方が速く読み込める」という記載があります。もし先行ロードができるタイミングがあれば、是非使用してみてください。

▼ メーカーヘルプ:先行する LOAD(←これが先行ロードのことを指します)
 https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/load-data-from-previously-loaded-table.htm#anchor-3
 "Resident を使用しても同じ結果を得られますが、ほとんどの場合、先行する LOAD の方が時間がかかりません。"

・計算を一か所にまとめ、その上に配置されたLOAD文で計算済みの項目を再利用できます。

・先行ロードのLOADで「LOAD distinct」と記載するだけでdistinctを用いた読み込みが可能です。

・複数の連続した変換を定義できます。

注意点
・先行ロードで、Order by句を使用してレコードをソートすることはできません。
 レコードをソートしたい場合は、Resident句を使用する必要があります。

・以下のプレフィックスを使用する場合、先行ロードは使えません。
 ①Crosstable
 ②Join
 ③Intervalmatch

・先行ロードでdistinctを使用してデータをロードしている場合、distinctは先行ロード部分に記載したもののみ適用されます。例えば以下の「▼スクリプト例」のようにdistinctを使用したい場合は、先行ロード部分にdistinctを記載します。もし後半部分にdistinctを記載した場合は、distinctされない状態でロードされます。

▼スクリプト例

LOAD // LOAD distinct と記載するとdistinctされます
年月日,
金額;

Table:
LOAD // LOAD distinct と記載してもdistinctされません
年月日,
金額
Inline
[
年月日,金額
2024/11/01,100
2024/11/01,100
2024/11/02,300
];

先行ロードの実践:サンプルデータの紹介

では、実際に先行ロードを使用した場合の記述例をご紹介します。
今回は、Excelファイル「番号別金額.xlsx」の「番号別金額」シートを読み込みます。

▼番号別金額 テーブル

番号 年月日 金額
101 2024/10/30 500
102 2024/10/31 300
103 2024/11/01 900
104 2024/11/02 700
105 2024/11/03 400

使用例1.「Group By」などで合計を求めたい

前述のテーブルから「年月」ごとの「金額」を求めたい場合を例に考えます。
「年月日」を「年月」として取り込むためにDate#関数等を使用しますが、Group By句は項目名以外を指定できないため、先行ロードを使わない場合、以下のように、一時的に tempテーブルを作成するためNoConcatenateやDrop Tableを記述する必要があります。

▼「先行ロード」を使わないスクリプト例

temp:
LOAD
年月日,
Date#(Date(年月日,'YYYY/MM'),'YYYY/MM') as 年月,
金額
FROM [lib://DataFiles/番号別金額.xlsx]
(ooxml, embedded labels, table is 番号別金額);

NoConcatenate

Table:
LOAD
年月,
Sum(金額) as 合計金額
Resident temp
Group By 年月;

Drop Table temp;

先行ロードを使うと、1つのテーブルとして扱われるため、以下2つの処理をする必要がありません。
・NoConcatenate
・Drop Table temp

▼「先行ロード」を使ったスクリプト例

LOAD
年月,
Sum(金額) as 合計金額
Group By 年月;

Table:
LOAD
年月日,
Date#(Date(年月日,'YYYY/MM'),'YYYY/MM') as 年月,
金額
FROM [lib://DataFiles/番号別金額.xlsx]
(ooxml, embedded labels, table is 番号別金額);

上述の”「先行ロード」を使わないスクリプト例”、”「先行ロード」を使ったスクリプト例”はどちらも同じ読み込み結果になり、以下のテーブルが作成されます。

読み込み結果:

年月 合計金額
2024/10 800
2024/11 2000

使用例2.計算結果を再利用したい場合

If関数の条件が多い場合や、ある特定の数式の条件が他の項目にも影響を及ぼすようなスクリプトを記載している場合、スクリプトが長くなることがあります。
If関数の条件などを元に、項目を作成したい場合、先行ロードを使った方がまとまりが良くなる場合があります。

例として、番号「101,102」をA、「103,104」をB、「105」をCとするような「案件」項目を作成し、その後「A-101」のような「分類キー」項目を作成したいとします。

作成したいデータ:

分類キー 案件 番号 年月日 金額
A-101 A 101 2024/10/30 500
A-102 A 102 2024/10/31 300
B-103 B 103 2024/11/01 900
B-104 B 104 2024/11/02 700
C-105 C 105 2024/11/03 400

▼「先行ロード」を使わないスクリプト例

Table:
LOAD
If(番号=101 or 番号=102,'A',
If(番号=103 or 番号=104,'B',
If(番号=105,'C'
))) & '-' & 番号 as 分類キー,

If(番号=101 or 番号=102,'A',
If(番号=103 or 番号=104,'B',
If(番号=105,'C'
))) as 案件,

番号,
年月日,
金額
FROM [lib://DataFiles/番号別金額.xlsx]
(ooxml, embedded labels, table is 番号別金額);

▼「先行ロード」を使ったスクリプト例

LOAD
案件 & '-' & 番号 as 分類キー,
*;

Table:
LOAD
If(番号=101 or 番号=102,'A',
If(番号=103 or 番号=104,'B',
If(番号=105,'C'
))) as 案件,
番号,
年月日,
金額
FROM [lib://DataFiles/番号別金額.xlsx]
(ooxml, embedded labels, table is 番号別金額);

上記2つのテーブルでは同じ「作成したいデータ」のテーブルが作成されますが、先行ロードを使ったロードスクリプトでは、If関数を再度記載する必要がありません。

使用例3.SELECT文でロードされたデータを変換したい

例えばデータベースからSELECT文を使用してデータをロードすると、自動で「SQL SELECT」や「SELECT」というスクリプトの記載がされます。
「SELECT」「SQL」文は、Qlik Sense側ではなく、データ元となるデータベース等によって、構文が正しいかが確認されるため、Qlik独自の関数を入力するとエラーになります。

本来、Date関数などのQlik独自の関数で読み込みを行うためには一度データを読み込んでから、Resident句を使ってもう一度読み込みなおす必要がありますが、先行ロードを使用することで、スクリプトでの計算を一か所にまとめ、簡潔に表現することができます。

以下はデータの変換を行う場所、SELECT文の上にLOAD文を追加して、「YYYY/MM/DD」書式のデータをDate関数で「YYYYMMDD」書式にする記載です。

▼「先行ロード」を使ったスクリプト例

LOAD
番号,
Date(年月日,'YYYYMMDD') as 年月日;
Table:
SQL SELECT 番号,年月日 FROM … ;

データのロード結果:

番号 年月日
101 20241030
102 20241031
103 20241101
104 20241102
105 20241103

さいごに

いかがでしたでしょうか。今回ご紹介した先行ロードを利用して、ロードスクリプトをより短く簡潔にし、より高速にデータが処理されるように工夫してみてください。
先行ロードの設定は下記リンクの「㉒先行ロードの使用方法(4分53秒)」の動画でも解説していますので、ぜひご覧ください!
Qlik製品を使い始めたばかりの方に必見!「BI学校」のススメ

執筆者情報:

株式会社アシスト DX推進技術本部 2021年に入社し、現在3年目。
今までで1000件以上のサポートを対応しております。
日々進化するIT、BIの世界に置いて行かれないよう精進中です。

関連している記事

  • Qlik Cloud
  • Qlik Sense
  • 開発者
  • データロード
  • 可視化・分析
2025.01.30

Qlik Senseで前年同月のデータを求めてみよう!

Qlik Senseで分析を行う際、前年同月のデータを使って比較をしたいと思ったことはありませんか?

  • Qlik Cloud
  • Qlik Sense
  • 開発者
  • 可視化・分析
2024.12.27

テーブルで任意の列や行を表示できるようにしたい!

テーブルに表示する列や行を、ユーザーが選択できるようにする方法をご紹介します!

  • Qlik Cloud
  • 運用者
  • その他
2024.12.24

モニタリングアプリで現状をチェックしてみよう-Qlik Cloud編

Qlik Senseでは運用状況を効率的に把握するための 便利なモニタリングアプリが用意されています。 モニタリングアプリの使い方をご紹介いたします。

ページの先頭へ戻る