SQL 통합 및 LookML 객체 참조

강력한 LookML을 작성하려면 현재 범위에 속하지 않는 경우에도 기존 측정기준, 측정값, 보기 또는 파생 테이블을 참조할 수 있어야 합니다. 또한 기본 테이블의 열을 참조하고 데이터베이스 언어의 함수 호출을 사용하여 이러한 값을 조작해야 합니다.

대체 연산자($)

대체 연산자인 $는 LookML 코드를 재사용하고 모듈화하여 다른 뷰와 파생 테이블, SQL 테이블의 열 또는 LookML 측정기준 및 측정을 참조할 수 있도록 합니다. 이는 두 가지 이유에서 좋습니다. 첫째, 매우 까다로운 측정기준 또는 측정값을 이미 확보했을 수 있으므로 복잡한 작업을 다시 할 필요가 없습니다. 둘째, 측정기준 또는 측정값을 변경하면 해당 항목과 연결된 다른 모든 항목에 변경사항이 적용될 수 있습니다.

대체 연산자를 사용하는 몇 가지 방법이 있습니다.

${TABLE}.column_name은 작업 중인 뷰에 연결된 테이블의 열을 참조합니다. 예를 들면 다음과 같습니다.

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

${field_name}은 작업 중인 보기 내에서 측정기준 또는 측정값을 참조합니다. 예를 들면 다음과 같습니다.

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

${view_name.field_name}은 다른 뷰의 측정기준 또는 측정값을 참조합니다. 예를 들면 다음과 같습니다.

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

${view_name.SQL_TABLE_NAME}은 다른 뷰 또는 파생 테이블을 참조합니다. 이 참조의 SQL_TABLE_NAME은 리터럴 문자열입니다. 아무 것도 바꿀 필요가 없습니다. 예를 들면 다음과 같습니다.

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}데이터 그룹과 함께 사용되는 sql_trigger 매개변수에서 작동하지 않습니다.

범위 지정 및 이름 지정

Explore, 뷰, 필드, 세트의 이름을 지정할 수 있습니다. 이러한 Looker 식별자는 따옴표 없이 작성됩니다.

LookML 필드 및 세트에는 전체 이름닉네임이 있습니다.

  • 전체 이름은 <view>.<field-name | set-name> 형식입니다. 왼쪽에는 필드 또는 세트가 포함된 뷰인 범위가 표시됩니다. 오른쪽은 특정 필드 또는 세트 이름을 지정합니다.
  • 닉네임은 마침표를 사용하지 않고 <field-name | set-name> 형식을 사용합니다. Looker는 닉네임을 사용하는 범위를 통해 전체 이름으로 확장합니다.

다음은 여러 형식의 이름과 범위를 보여주는 예입니다. 이는 비현실적 필드 그룹이지만 다양한 가능한 범위 지정 표현식을 보여주기 위해 표시됩니다.

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
    ]
  }
}

위의 dimension: customer_address 선언에서 SQL 블록(customer)의 기본 뷰는 둘러싼 뷰 범위(orders)와 다릅니다. 이 기능은 서로 다른 두 뷰 간에 필드를 비교해야 하는 경우에 유용합니다.

뷰('뷰 A'라고 함)는 다른 뷰에서 정의된 필드('뷰 B'라고 함)를 의미할 때 다음과 같은 몇 가지 사항에 유의해야 합니다.

  1. 뷰 B 파일은 include 매개변수를 사용하여 뷰 A와 동일한 모델에 포함되어야 합니다.
  2. 하나 이상의 Explore에서 A를 보려면 보기 B를 조인해야 합니다. 조인에 대한 자세한 내용은 LookML에서 조인으로 작업하기 페이지를 참조하세요.

SQL 언어

Looker는 MySQL, Postgres, Redshift, BigQuery 등과 같은 다양한 데이터베이스 유형을 지원합니다. 각 데이터베이스는 SQL 언어라고 하는 함수 이름이 약간 다른 특성 세트를 지원합니다.

LookML은 모든 SQL 언어에서 작동하도록 설계되었으며 LookML은 다른 언어 사이에서 한 언어를 특별히 선호하지 않습니다. 하지만 특정 LookML 매개변수에 SQL 코드 표현식(SQL 블록이라고 함)을 포함해야 합니다. 이러한 매개변수를 사용하면 Looker가 SQL 표현식을 데이터베이스에 직접 전달하므로 데이터베이스와 일치하는 SQL 언어를 사용해야 합니다. 예를 들어 SQL 함수를 사용할 경우 데이터베이스가 지원하는 함수여야 합니다.

SQL 블록

일부 LookML 매개변수에서는 Looker가 데이터베이스에서 데이터를 검색하는 방법을 이해할 수 있도록 원시 SQL 표현식을 제공해야 합니다.

sql_로 시작하는 LookML 매개변수에는 SQL 형식의 표현식이 필요합니다. 예를 들면 sql_always_where, sql_on, sql_table_name입니다. SQL 블록에 대한 가장 일반적인 LookML 매개변수는 측정기준 및 측정값 필드 정의에서 측정기준 또는 측정값을 정의하는 SQL 표현식을 지정하는 데 사용되는 sql입니다.

SQL 블록에서 지정하는 코드는 단일 필드 이름만큼 간단하거나 상관 하위 선택만큼 복잡할 수 있습니다. 이 콘텐츠는 매우 복잡할 수 있으며, 원시 SQL에서 커스텀 쿼리 로직을 표현해야 할 거의 모든 요구사항을 수용합니다. SQL 블록에서 사용하는 코드는 데이터베이스에서 사용하는 SQL 언어와 일치해야 합니다.

측정기준 및 측정값에 대한 SQL 블록 예

다음은 측정기준 및 측정값에 대한 SQL 블록 예입니다. LookML 대체 연산자($)를 사용하면 이러한 sql 선언을 SQL과 달리 기만적으로 표시할 수 있습니다. 하지만 대체가 발생하면 결과 문자열은 순수 SQL이며 Looker가 쿼리의 SELECT 절에 이 문자열을 삽입합니다.

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}) ;;
}

위의 마지막 두 측정기준과 같이 SQL 블록은 기본 데이터베이스에서 지원하는 함수(예: 이 경우 MySQL 함수 CONCATDATEDIFF)를 사용할 수 있습니다.

상관 하위 선택이 있는 SQL 블록 예

상관 하위 선택을 포함하여 모든 SQL 문을 필드의 SQL 블록에 배치할 수 있습니다. 예는 아래와 같습니다.

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"
  }
}

파생 테이블의 SQL 블록 예

파생된 테이블은 SQL 블록을 사용하여 테이블을 파생하는 쿼리를 지정합니다. 예는 아래와 같습니다.

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
  }
}

LookML 필드 유형 참조

다른 필드 내에서 기존 LookML 필드를 참조할 때 이중 콜론(::)과 원하는 유형을 사용하여 참조된 필드를 특정 데이터 유형으로 처리하도록 Looker에 지시할 수 있습니다. 예를 들어 다른 필드에서 orders.created_date 측정기준을 참조하는 경우 ${orders.created_date::date} 구문을 사용하여 created_date 필드가 문자열로 변환되지 않고 Looker가 생성하는 SQL의 날짜 필드로 처리되도록 할 수 있습니다.

참조에 사용할 수 있는 데이터 유형은 참조하는 원래 필드의 데이터 유형에 따라 다릅니다. 예를 들어 문자열 필드를 참조하는 경우 ::string만 지정할 수 있습니다. 다음은 각 필드 유형에 사용할 수 있도록 허용된 필드 유형 참조의 전체 목록입니다.

  • 문자열 필드 참조에 ::string을 사용할 수 있습니다.
  • 숫자 필드 참조에 ::string::number를 사용할 수 있습니다.
  • 날짜 또는 시간 필드 참조에 ::string, ::date, ::datetime을 사용할 수 있습니다.

    ::string::date를 사용하는 참조는 쿼리 시간대에서 데이터를 반환하고 ::datetime을 사용하는 참조는 데이터베이스 시간대의 데이터를 반환합니다.
  • yesno 필드 참조에 ::string, ::number, ::boolean을 사용할 수 있습니다.

    부울 데이터 유형을 지원하지 않는 데이터베이스 언어에서는 ::boolean 유형을 사용하는 필드 참조를 사용할 수 없습니다.
  • 위치 필드 참조에 ::latitude::longitude를 사용할 수 있습니다.

날짜 필드에 LookML 필드 유형 참조 사용

예를 들어 enrollment_month 측정기준과 graduation_month 측정기준이 있고 둘 다 type: time의 측정기준 그룹 내에서 생성되었다고 가정해 보겠습니다. 이 예에서 enrollment_month 측정기준은 type: time의 다음 측정기준 그룹에 의해 생성됩니다.


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

마찬가지로 graduation_month 측정기준은 type: time의 다음 측정기준 그룹에 의해 생성됩니다.


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

enrollment_monthgraduation_month 측정기준을 사용하여 type: duration의 측정기준 그룹을 만들면 학생 등록 및 졸업으로 경과된 월 또는 연 수를 계산할 수 있습니다. 그러나 일부 날짜 필드는 Looker가 생성하는 SQL의 문자열로 변환되므로 enrollment_monthgraduation_month 측정기준을 sql_startsql_end 값으로 설정하면 오류가 발생할 수 있습니다.

이러한 시간 필드가 문자열로 Cast 변환되어 발생하는 오류를 방지하기 위한 한 가지 옵션은 sql_startsql_end 매개변수의 enrollmentgraduation 측정기준 그룹에서 raw 기간을 참조하는 type: duration 측정기준 그룹을 만드는 것입니다.


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

그러면 탐색 UI에 등록된 기간등록된 연도라는 개별 측정기준이 포함된 등록 기간 측정기준 그룹이 생성됩니다.

type: duration의 측정기준 그룹에서 raw 기간을 사용하는 간단한 방법은 sql_startsql_end 매개변수에서 참조되는 필드에 ::date 또는 ::datetime 참조 유형을 지정하는 것입니다.


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

이 예의 LookML은 등록된 기간 측정기준 그룹을 만들지만 ::date 참조를 사용하면 raw 기간을 지정하거나 SQL을 사용하여 문자열로 Cast 변환하지 않고 enrollment_monthgraduation_month 측정기준을 사용할 수 있습니다.

LookML 필드 유형 참조를 사용하여 type: duration의 커스텀 측정기준 그룹을 만드는 방법의 추가 예는 dimension_group 매개변수 문서 페이지를 참조하세요.

Looker 6.8에서 참조할 수 없는 type: list 측정값에 이 구문을 사용할 수 없습니다.

LookML 상수

constant 매개변수를 사용하면 LookML 프로젝트 전체에서 사용할 수 있는 상수를 지정할 수 있습니다. LookML 상수를 사용하면 값을 한 번 정의하고 문자열이 허용되는 프로젝트의 모든 부분에서 참조하므로 LookML 코드 반복이 줄어듭니다.

상수는 프로젝트 매니페스트 파일 내에서 선언되어야 하며 상수 값은 문자열이어야 합니다. 예를 들어 다음과 같이 "Okayama" 값을 사용하여 상수 city를 정의할 수 있습니다.

constant: city {
  value: "Okayama"
}

그런 다음 city 상수는 @{city} 구문을 사용하여 프로젝트 전체에서 참조할 수 있습니다. 예를 들어 users Explore의 city 상수를 label 매개변수와 함께 사용할 수 있습니다.


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

그러면 Looker가 기본 사용자가 아니라 Explore 메뉴와 Explore 제목 모두에 Okama 사용자가 표시됩니다.

LookML 상수를 사용하여 재사용 가능한 코드를 작성하는 방법에 대한 자세한 내용 및 예는 constant 매개변수 문서 페이지를 참조하세요.