ビューの SQL コンセプト

LookML プロジェクト内の各ビューファイルは、Looker 内の単一のビューを定義します。このビューでは、クエリするテーブルと、そのテーブルから Looker UI に表示するフィールド(ディメンションとメジャー)を指定します。ビューは、データベース内の単一のテーブルまたは単一の派生テーブルのいずれかに対応します。

このガイドでは、次のトピックについて学習します。

SQL を使用して LookML で派生テーブルを定義してカスタマイズする方法について詳しくは、派生テーブルの SQL コンセプトをご覧ください。

ビュー

以下は、users.view というビューファイルの例です。このファイルには、クエリ対象のデータベース テーブルの定義と、いくつかのディメンションとメジャーが含まれています。

view: users {
  sql_table_name: thelook.users ;;

  dimension: id {
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
  }

  dimension: age {
    type: number
    sql: ${TABLE}.age ;;
  }
   measure: average_age {
    type: average
    sql: ${age} ;;  }

  dimension_group: created {
    type: time
    timeframes: [raw, time, date, week, month, quarter, year]
    sql: ${TABLE}.created_at ;;
  }

  measure: count {
    type: count
  }
}

ビュー定義の最初の要素は sql_table_name パラメータです。これは、ビューでクエリされるデータベース内のテーブルを指定します。ビューへの他のすべての参照ではテーブル エイリアス ${TABLE} が使用されるため、この値はモデル全体でテーブル名が定義される唯一の場所です。データベース テーブル名を変更する場合は、sql_table_name パラメータでのみ変更する必要があります。データベース テーブルを参照する際には、いくつかの考慮事項があります。

Looker は sql_table_name 値を使用して SQL FROM 句を記述し、その後にテーブル エイリアスとなるビュー名を記述します。SQL で記述すると次のようになります。

FROM `thelook`.`users` AS `users`

Looker は、ビューで定義されたディメンションとメジャーを使用して SQL SELECT 句を生成します。各ディメンションでは、ディメンションの(文字列、数値、ブール値など)と、テーブル エイリアスを使用してビュー内のディメンションを参照する sql LookML パラメータを定義します。age というディメンションの場合は、次の例をご覧ください。

  dimension: age {
    type: number
    sql: ${TABLE}.age ;;
  }

Looker がデータベースに送信する SQL を作成するときに、ビューのエイリアスが ${TABLE} に置き換えられます。前の例の age ディメンションの場合、Looker は次のような SELECT 句を生成します。

SELECT `users`.`age` AS `users.age`

メジャーは、多くの場合、ディメンションに対して実行される集計です。ディメンション エイリアスは、指標の sql 式で指定します。たとえば、age ディメンションの平均を計算する指標には、次の例のように、エイリアス ${age} を含む sql 式が含まれる場合があります。

  dimension: age {
    type: number
    sql: ${TABLE}.age ;;
  }

  measure: average_age {
    type: average
    sql: ${age} ;;
  }

age ディメンションの名前を変更すると、その新しいエイリアスは、そのディメンションのエイリアスの参照に反映されます。

ビューファイルのカスタマイズ

ビューファイルの SQL 式をカスタマイズすることも、Looker の組み込みの LookML ロジックを使用して SQL 式のロジックを模倣することもできます。

SQL 式を使用する

年齢データを 4 つのコホートに分割し、18 歳未満のユーザーを「青少年」、18 ~ 35 歳のユーザーを「若年成人」、36 ~ 65 歳のユーザーを「高齢成人」、65 歳以上のユーザーを「高齢者」と定義するとします。この分割を行うには、これらのコホートをキャプチャする sql 式を使用して、新しいディメンション(dimension: age_cohort など)を定義する必要があります。次の LookML ディメンション定義では、MySQL データベース接続に適した CASE ステートメントを使用しています。

dimension: age_cohort {
  type: string
  sql:
    CASE
      WHEN ${age} < 18 THEN 'Youth'
      WHEN ${age} < 35 THEN 'Young Adult'
      WHEN ${age} < 65 THEN 'Older Adult'
      ELSE 'Senior'
    END ;;
}

年齢層をディメンションとして定義したので、年齢層ディメンションを Explore クエリに含めることで、CASE ロジックを再利用できます。

年齢コホート ディメンションを使用して Explore クエリを作成する場合は、Explore の [SQL] タブを使用して Looker が生成した SQL を表示できます。年齢層ディメンションを使用すると、SQL は次のようになります。

SELECT
CASE
  WHEN users.age < 18 THEN 'Youth'
  WHEN users.age < 35 THEN 'Young Adult'
  WHEN users.age < 65 THEN 'Older Adult'
  ELSE 'Senior'
END  AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
  `thelook`.`users` AS `users`
GROUP BY
  1
ORDER BY
  2 DESC
LIMIT 500

Looker の組み込みケースロジックを使用する

SQL CASE ステートメントと同じ効果を、データベースに依存しない式で実現できます。LookML の case パラメータを使用すると、sql 式を使用して特定の条件と文字列をキャプチャし、結果にラベルを付ける when ステートメントで構成されるコホート バケットを定義できます。

次の例は、case LookML パラメータで書き込まれた同じ新しい age_cohort ディメンションの例です。

  dimension: age_cohort {
    case: {
      when: {
        sql: ${age} < 18 ;;
        label: "Youth"
      }
      when: {
        sql: ${age} < 35 ;;
        label: "Young Adult"
      }
      when: {
        sql: ${age} < 65 ;;
        label: "Middle-aged Adult"
      }
      else: "Older Adult"
    }
  }

実行時に、Looker はデータベースに適した SQL CASE 構文を構築します。また、Looker はグループの並べ替えを処理する別の式を構築するため、結果のラベルは英数字で並べ替えられるだけではありません(並べ替え順序を英数字として定義しない限り)。Looker は、次のような SQL クエリを生成します。

SELECT
CASE
  WHEN users.age < 18  THEN '0'
  WHEN users.age < 35  THEN '1'
  WHEN users.age < 65  THEN '2'
  ELSE '3'
END AS `users.age_cohort__sort_`,
CASE
  WHEN users.age < 18  THEN 'Youth'
  WHEN users.age < 35  THEN 'Young Adult'
  WHEN users.age < 65  THEN 'Older Adult'
  ELSE 'Senior'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
  `thelook`.`users` AS `users`
GROUP BY
  1,
  2
ORDER BY
  1
LIMIT 500

Looker の組み込みの bin または tier ロジックを使用する

数値のグループ化方法を指定する別の方法として、Looker の組み込みの bin または tier パラメータ型を使用します。type:binbins パラメータと組み合わせて使用し、type: tiertiers パラメータと組み合わせて使用して、数値ディメンションを一連の数値範囲に分割します。一方で、各ビンにラベルを定義することはできません。

次の LookML の例では、ディメンションで bins パラメータを使用して、各セットの最小値を定義しています。

  dimension: age_cohort {
    type: bin
    bins: [18,36,65]
    style: integer
    sql: ${age} ;;
  }

ディメンションで tiers パラメータを使用する方法はまったく同じです。次に例を示します。

  dimension: age_cohort {
    type: tier
    tiers: [18,36,65]
    style: integer
    sql: ${age} ;;
  }

次のような SQL ステートメントが生成されます。

SELECT
CASE
  WHEN users.age  < 18 THEN '0'
  WHEN users.age  >= 18 AND users.age  < 36 THEN '1'
  WHEN users.age  >= 36 AND users.age  < 65 THEN '2'
  WHEN users.age  >= 65 THEN '3'
  ELSE '4'
END AS `users.age_cohort__sort_`,
CASE
  WHEN users.age  < 18 THEN 'Below 18'
  WHEN users.age  >= 18 AND users.age  < 36 THEN '18 to 35'
  WHEN users.age  >= 36 AND users.age  < 65 THEN '36 to 64'
  WHEN users.age  >= 65 THEN '65 or Above'
  ELSE 'Undefined'
END AS `users.age_cohort`,
AVG(`age`) AS `users.average_age`,
COUNT(*) AS `users.count`
FROM
  `thelook`.`users` AS `users`
GROUP BY
  1,
  2
ORDER BY
  1
LIMIT 500