Menggabungkan SQL dan merujuk ke objek LookML

Untuk menulis LookML yang efektif, Anda harus dapat mereferensikan dimensi, ukuran, tabel virtual, atau tabel turunan yang ada meskipun tidak berada dalam cakupan saat ini. Anda juga harus mereferensikan kolom dalam tabel yang mendasarinya dan menggunakan panggilan fungsi dialek database untuk memanipulasi nilai tersebut.

Operator substitusi ($)

Operator substitusi, $, membuat kode LookML lebih dapat digunakan kembali dan modular, sehingga Anda dapat mereferensikan tabel virtual dan tabel turunan lainnya, kolom dalam tabel SQL, atau dimensi dan ukuran LookML. Hal ini bagus karena dua alasan. Pertama, Anda mungkin telah membuat dimensi atau ukuran yang sangat rumit, dan Anda tidak perlu menulis semua kerumitan tersebut lagi. Kedua, jika Anda mengubah sesuatu tentang dimensi atau ukuran, perubahan tersebut dapat diterapkan ke semua hal lain yang bergantung padanya.

Ada beberapa cara untuk menggunakan operator substitusi:

${TABLE}.column_name mereferensikan kolom dalam tabel yang terhubung ke tabel virtual yang sedang Anda gunakan. Contoh:

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

${field_name} mereferensikan dimensi atau ukuran dalam tabel virtual yang sedang Anda gunakan. Contoh:

measure: total_population {
  type: sum
  sql: ${population} ;;
}

${view_name.field_name} mereferensikan dimensi atau ukuran dari tabel virtual lain. Contoh:

dimension: lifetime_orders {
  type: number
  sql: ${user_order_facts.lifetime_orders} ;;
}

${view_name.SQL_TABLE_NAME} mereferensikan tabel virtual atau tabel turunan. Perhatikan bahwa SQL_TABLE_NAME dalam referensi ini adalah string literal; Anda tidak perlu menggantinya dengan apa pun. Contoh:

explore: trips {
  view_label: "Long Trips"
  # This will ensure that we only see trips that are longer than average!
  sql_always_where: ${trips.trip_duration}>=(SELECT tripduration FROM ${average_trip_duration.SQL_TABLE_NAME});;
}

${view_name.SQL_TABLE_NAME} tidak berfungsi dengan parameter sql_trigger yang digunakan dengan grup data.

Cakupan dan penamaan

Anda dapat memberi nama pada Eksplorasi, tabel virtual, kolom, dan set. ID Looker ini ditulis tanpa tanda kutip.

Kolom dan set LookML memiliki nama lengkap dan nama pendek:

  • Nama lengkap memiliki format <view>.<field-name | set-name>. Sisi kiri menunjukkan cakupan, yaitu tabel virtual yang berisi kolom atau set. Sisi kanan menentukan nama kolom atau set tertentu.
  • Nama pendek hanya menggunakan format <field-name | set-name>, tanpa periode pemisah. Looker memperluas nama pendek menjadi nama lengkap dengan menggunakan cakupan tempat nama pendek tersebut digunakan.

Berikut adalah contoh yang menunjukkan banyak bentuk nama dan cakupan. Ini adalah grup kolom yang tidak realistis, tetapi ditampilkan untuk mendemonstrasikan berbagai kemungkinan ekspresi cakupan.

view: orders {                   # "orders" becomes the containing scope
  measure: count {               # short name, equivalent to orders.count
    type: count
  }
  dimension: customer_id {       # short name, equivalent to orders.customer_id
    type: number
    sql: ${TABLE}.customer_id ;;
  }
  dimension: customer_address {  # short name, equivalent to orders.customer_address
    sql: ${customer.address} ;;  # full name, references a field defined in the "customer" view
  }
  set: drill_fields {            # short name, equivalent to orders.drill_fields
    fields: [
      count,                     # short name, equivalent to orders.count
      customer.id                # full name, references a field defined in the "customer" view
    ]
  }
}

Dalam deklarasi dimension: customer_address, perhatikan bahwa tabel virtual yang mendasari blok SQL (customer) berbeda dengan cakupan tabel virtual yang melampirkan (orders). Hal ini dapat berguna saat Anda perlu membandingkan kolom antara dua tabel virtual yang berbeda.

Saat tabel virtual (kita akan menyebutnya "tabel virtual A") merujuk ke kolom yang ditentukan dalam tabel virtual lain (kita akan menyebutnya "tabel virtual B"), ada beberapa hal yang perlu diingat:

  1. File tabel virtual B harus disertakan dalam model yang sama dengan tabel virtual A, menggunakan parameter include.
  2. Tabel virtual B harus digabungkan ke tabel virtual A dalam satu atau beberapa Eksplorasi. Lihat halaman Bekerja dengan gabungan di LookML untuk mempelajari gabungan.

Dialek SQL

Looker mendukung banyak jenis database, seperti MySQL, Postgres, Redshift, BigQuery, dan sebagainya. Setiap database mendukung kumpulan fitur yang sedikit berbeda dengan nama fungsi yang berbeda, yang disebut sebagai dialek SQL.

LookML dirancang untuk berfungsi dengan semua dialek SQL, dan LookML tidak lebih memilih satu dialek daripada dialek lainnya. Namun, Anda harus menyertakan ekspresi kode SQL (dikenal sebagai blok SQL) dalam parameter LookML tertentu. Dengan parameter ini, Looker meneruskan ekspresi SQL langsung ke database Anda, sehingga Anda harus menggunakan dialek SQL yang cocok dengan database Anda. Misalnya, jika Anda menggunakan fungsi SQL, fungsi tersebut harus merupakan fungsi yang didukung oleh database Anda.

Blok SQL

Beberapa parameter LookML mengharuskan Anda memberikan ekspresi SQL mentah agar Looker dapat memahami cara mengambil data dari database Anda.

Parameter LookML yang dimulai dengan sql_ mengharapkan ekspresi SQL dalam beberapa bentuk. Contohnya adalah: sql_always_where, sql_on, dan sql_table_name. Parameter LookML yang paling umum untuk blok SQL adalah sql, yang digunakan dalam definisi kolom dimensi dan ukuran untuk menentukan ekspresi SQL yang menentukan dimensi atau ukuran.

Kode yang Anda tentukan dalam blok SQL dapat sesederhana satu nama kolom atau serumit subpilih yang berkorelasi. Kontennya bisa sangat kompleks, mengakomodasi hampir semua kebutuhan yang mungkin Anda miliki untuk mengekspresikan logika kueri kustom dalam SQL mentah. Perhatikan bahwa kode yang Anda gunakan dalam blok SQL harus cocok dengan dialek SQL yang digunakan oleh database.

Contoh blok SQL untuk dimensi dan ukuran

Berikut adalah contoh blok SQL untuk dimensi dan ukuran. Operator substitusi LookML ($) dapat membuat deklarasi sql ini tampak berbeda dengan SQL. Namun, setelah substitusi terjadi, string yang dihasilkan adalah SQL murni, yang disisipkan Looker ke dalam klausa SELECT kueri.

dimension: id {
  primary_key: yes
  sql: ${TABLE}.id ;;   # Specify the primary key, id
}
measure: average_cost {
  type: average
  value_format: "0.00"
  sql: ${order_items.cost} ;;   # Specify the field that you want to average
}
dimension: name {
  sql: CONCAT(${first_name}, ' ', ${last_name}) ;;
}
dimension: days_in_inventory {
  type: int
  sql: DATEDIFF(${sold_date}, ${created_date}) ;;
}

Seperti yang ditunjukkan dalam dua dimensi terakhir, blok SQL dapat menggunakan fungsi yang didukung oleh database yang mendasarinya (seperti fungsi MySQL CONCAT dan DATEDIFF dalam contoh ini).

Contoh blok SQL dengan subpilih yang berkorelasi

Anda dapat menempatkan pernyataan SQL apa pun di blok SQL kolom, termasuk subpilih yang berkorelasi. Berikut adalah contohnya:

view: customers {
  dimension: id {
    primary_key: yes
    sql: ${TABLE}.id ;;
  }
  dimension: first_order_id {
    sql: (SELECT MIN(id) FROM orders o WHERE o.customer_id=customers.id) ;;
         # correlated subselect to derive the value for "first_order_id"
  }
}

Contoh blok SQL untuk tabel turunan

Tabel turunan menggunakan blok SQL untuk menentukan kueri yang menurunkan tabel. Berikut adalah contohnya:

view: user_order_facts {
  derived_table: {
    sql:            # Get the number of orders for each user
      SELECT
        user_id
        , COUNT(*) as lifetime_orders
      FROM orders
      GROUP BY 1 ;;
  }
  # later, dimension declarations reference the derived column(s)

  dimension: lifetime_orders {
    type: number
  }
}

Referensi jenis kolom LookML

Saat mereferensikan kolom LookML yang ada dalam kolom lain, Anda dapat menginstruksikan Looker untuk memperlakukan kolom yang direferensikan sebagai jenis data tertentu dengan menggunakan titik dua ganda (::) diikuti dengan jenis yang diinginkan. Misalnya, jika Anda mereferensikan dimensi orders.created_date dalam kolom lain, Anda dapat menggunakan sintaksis ${orders.created_date::date} untuk memastikan bahwa kolom created_date akan diperlakukan sebagai kolom tanggal dalam SQL yang dihasilkan Looker, bukan ditransmisikan sebagai string.

Jenis data yang dapat Anda gunakan dalam referensi bergantung pada jenis data kolom asli yang Anda referensikan. Misalnya, jika Anda mereferensikan kolom string, satu-satunya jenis data yang dapat Anda tentukan adalah ::string. Berikut adalah daftar lengkap referensi jenis kolom yang diizinkan yang dapat Anda gunakan untuk setiap jenis kolom:

  • Dalam referensi ke kolom string, Anda dapat menggunakan ::string.
  • Dalam referensi ke kolom angka, Anda dapat menggunakan ::string dan ::number.
  • Dalam referensi ke kolom tanggal atau waktu, Anda dapat menggunakan ::string, ::date, dan ::datetime.

    Referensi yang menggunakan ::string dan ::date menampilkan data dalam zona waktu kueri, sedangkan referensi yang menggunakan ::datetime menampilkan data dalam zona waktu database.
  • Dalam referensi ke kolom yesno, Anda dapat menggunakan ::string, ::number, dan ::boolean.

    Referensi kolom yang menggunakan jenis ::boolean tidak tersedia untuk dialek database yang tidak mendukung jenis data Boolean.
  • Dalam referensi ke kolom lokasi, Anda dapat menggunakan ::latitude dan ::longitude.

Menggunakan referensi jenis kolom LookML dengan kolom tanggal

Sebagai contoh, misalkan Anda memiliki dimensi enrollment_month dan dimensi graduation_month, yang keduanya dibuat dalam grup dimensi type: time. Dalam contoh ini, dimensi enrollment_month dihasilkan oleh grup dimensi type: time berikut:


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

Demikian pula, dimensi graduation_month dibuat oleh grup dimensi type: time berikut:


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

Dengan menggunakan dimensi enrollment_month dan graduation_month, Anda dapat menghitung berapa bulan atau tahun yang berlalu antara pendaftaran dan kelulusan siswa dengan membuat grup dimensi type: duration. Namun, karena beberapa kolom tanggal ditransmisikan sebagai string dalam SQL yang dihasilkan Looker, menetapkan dimensi enrollment_month dan graduation_month sebagai nilai untuk sql_start dan sql_end dapat menyebabkan error.

Untuk menghindari error yang dihasilkan dari kolom waktu ini yang ditransmisikan sebagai string, salah satu opsinya adalah membuat grup dimensi type: duration, yang mereferensikan jangka waktu raw dari grup dimensi enrollment dan graduation dalam parameter sql_start dan sql_end:


dimension_group: enrolled {
  type: duration
  intervals: [month, year]
  sql_start: ${enrollment_raw} ;;
  sql_end: ${graduation_raw} ;;
}

Di UI Eksplorasi, hal ini akan menghasilkan grup dimensi yang disebut Duration Enrolled, dengan dimensi individual Months Enrolled dan Years Enrolled.

Alternatif yang lebih sederhana untuk menggunakan jangka waktu raw dalam grup dimensi type: duration adalah menentukan jenis referensi ::date atau ::datetime untuk kolom yang direferensikan dalam parameter sql_start dan sql_end.


dimension_group: enrolled {
  type: duration
  intervals: [month, year]
  sql_start: ${enrollment_month::date} ;;
  sql_end: ${graduation_month::date} ;;
}

LookML dalam contoh ini juga membuat grup dimensi Duration Enrolled, tetapi menggunakan referensi ::date memungkinkan dimensi enrollment_month dan graduation_month digunakan tanpa menggunakan jangka waktu raw atau mentransmisikannya sebagai string dengan SQL.

Untuk contoh tambahan tentang cara menggunakan referensi jenis kolom LookML untuk membuat grup dimensi kustom type: duration, lihat halaman dokumentasi parameter dimension_group.

Sintaksis ini tidak tersedia dengan ukuran type: list, yang tidak dapat direferensikan mulai Looker 6.8.

Konstanta LookML

Parameter constant memungkinkan Anda menentukan konstanta yang dapat digunakan di seluruh project LookML. Dengan konstanta LookML, Anda dapat menentukan nilai satu kali dan mereferensikannya di bagian mana pun dalam project Anda yang menerima string, sehingga mengurangi pengulangan dalam kode LookML Anda.

Konstanta harus dideklarasikan dalam file manifes project, dan nilai untuk konstanta harus berupa string. Misalnya, Anda dapat menentukan konstanta city dengan nilai "Okayama" sebagai berikut:

constant: city {
  value: "Okayama"
}

Konstanta city kemudian dapat direferensikan di seluruh project Anda menggunakan sintaksis @{city}. Misalnya, Anda dapat menggunakan konstanta city dengan parameter label di Eksplorasi users:


explore: users {
  label: "@{city} Users"
}

Looker kemudian menampilkan Okayama Users di menu Explore dan di judul Eksplorasi, bukan Users default.

Untuk mengetahui informasi selengkapnya dan contoh cara menggunakan konstanta LookML untuk menulis kode yang dapat digunakan kembali, lihat halaman dokumentasi parameter constant.