Gängige LookML-Muster

Auf dieser Seite werden die folgenden häufigen Muster in LookML beschrieben:

Bezeichnungen für Felder (und Namen in der Benutzeroberfläche)

Looker konvertiert LookML-Feldnamen in die Zeichenfolgen, die auf der Benutzeroberfläche angezeigt werden, indem der Ansichtsname in normaler Schriftart mit dem fett formatierten Kurznamen des Feldes kombiniert wird. Beispielsweise wird ein Feld mit dem Namen Amount in der Ansicht Orders auf der Benutzeroberfläche als Orders Amount angezeigt. Zur besseren Veranschaulichung werden auf dieser Seite beide Feldnamen fett formatiert und der Ansichtsname ist in Großbuchstaben geschrieben (ORDERS Amount).

Wenn ein Feld einen anderen Namen als den Spaltennamen in einer Tabelle haben soll, ändern Sie den Feldnamen und verwenden Sie den Parameter sql, um das Feld mit der entsprechenden Spalte in der Tabelle zu verknüpfen. Im folgenden Beispiel hat die Tabelle airports eine Spalte cntrl_twr. In diesem Fall würde Looker die folgende Deklaration generieren:

view: airports {
  dimension: cntrl_twr {        # full name: airports.cntrl_twr
    type: yesno                 # default name: AIRPORT Cntrl Twr (Yes/No)
    sql: ${TABLE}.cntrl_twr ;;  # the sql expression for this field
  }
}

Sie können die Dimension cntrl_twr in einen für Menschen lesbaren Namen umbenennen:

view: airports {
  dimension: has_control_tower {  # full name: airports.has_control_tower
    type: yesno                   # aliased name: AIRPORTS Has Control Tower (Yes/No)
    sql: ${TABLE}.cntrl_twr ;;    # the sql expression for this field
  }
}

Anzahl anhand einer Dimension filtern

Sie können eine Gruppierung anhand einer Dimension und von Anzahl-Entitäten vornehmen. Durch Gruppierung anhand von USERS Country und ORDERS Count können Sie ermitteln, aus welchen Ländern Sie Aufträge erhalten. Oftmals ist es jedoch sinnvoll, eine Anzahl zu erstellen, die anhand eines Dimensionswerts gefiltert wird. Sie könnten beispielsweise einen neuen Messwert namens ORDERS France Count erstellen:

view: users {
  dimension: country {}
}
view: orders {
  dimension: id {
    primary_key: yes
    sql: ${TABLE}.id ;;
  }
  measure: count {
    type: count
    drill_fields: [detail]
  }
  measure: france_count {
    type: count   # COUNT(CASE WHEN users.country = 'France' THEN 1 ELSE NULL END)
    filters: [users.country: "France"]
  }
}

Filter können jeden beliebigen Ausdruck verwenden. Wenn Sie ein Feld benötigen, das die Benutzer aus der gesamten EU zählt, könnten Sie dies folgendermaßen umsetzen:

measure: eu_count {
  type: count   # COUNT(CASE WHEN users.countrycode IN 'UK','FR','ES' THEN 1 ELSE NULL END)
  drill_fields: [detail]
  filters: [users.countrycode: "UK,FR,ES"]
}

Wenn Sie die Ergebnisse anhand eines mathematischen Ausdrucks filtern möchten, müssen Sie diesen in doppelte Anführungszeichen einfügen:

measure: total_orders_above_100_dollars {
  type: sum   # SUM(CASE WHEN order.value > 100 THEN order.value ELSE NULL END)
  sql: ${order.value} ;;
  drill_fields: [detail]
  filters: [order.value: ">100"]
}

Prozentsätze

Viele Leistungskennzahlen werden als Prozentsätze angegeben, z. B. „Prozentsatz der zurückgesendeten Artikel“, „Prozentsatz der E-Mails, die zu einem Kauf geführt haben“ oder andere Formen von „Prozentsatz von X an Y“. Dem Gestaltungsmuster von LookML entsprechend werden die Anzahl für die zwei Bedingungen und dann ein drittes Feld erstellt, das das prozentuale Verhältnis zwischen den beiden berechnet.

dimension: returned {
  type: yesno
}
measure: count {   # total count of items
  type: count_distinct
  sql: ${TABLE}.id ;;
  drill_fields: [detail]
}
measure: returned_count {   # count of returned items
  type: count_distinct
  sql: ${TABLE}.id ;;
  drill_fields: [detail]
  filters: [returned: "Yes"]
}
measure: percent_returned {
  type: number
  sql: 100.0 * ${returned_count} / NULLIF(${count}, 0) ;;
  value_format: "0.00"
}

Verwenden Sie das folgende Format, um Prozentsätze zu berechnen. In Postgres ist die Anzahl eine Ganzzahl, und die Division von Ganzzahlen ergibt wiederum Ganzzahlen. Durch Multiplikation mit 100,0 wird die erste Anzahl in eine Gleitkommazahl umgerechnet, wodurch auch der Rest des Ausdrucks zu einem Gleitkommawert wird. Um Fehler aufgrund einer Division durch Null zu verhindern, rechnet der Parameter NULLIF(value, 0) einen fehlenden Wert in Null um, was zum Ergebnis Null führt und keinen Fehler ergibt.

100.0 * ${returned_count} / NULLIF(${count}, 0)

Sätze für Drilldown-Details verwenden

Zu den stärksten Funktionen von Looker gehört unter anderem die Fähigkeit, Daten so aufzuschlüsseln, dass die zugrunde liegenden Entitäten sichtbar werden, aus denen eine Anzahl oder ein anderer Messwert besteht.

Wenn Sie in der Benutzeroberfläche auf einen Messwert klicken, erstellt Looker eine neue Abfrage, um den Satz Daten zu lokalisieren, aus dem der Messwert besteht. Jeder Wert für jede Dimension in der Tabellenzeile wird hinzugefügt.

Zum Anzeigen der Details benötigt Looker eine festgelegte Liste mit Drill-Feldern, um anzuzeigen, dass auf den Wert des Messwerts geklickt wurde. Wenn Sie ein Modell generieren, erstellt der Generator in der Regel einige erste Drill-Felder für Sie. Darüber hinaus können Sie selbst weitere Drill-Felder hinzufügen. Angenommen, Sie messen die ORDERS Count nach USERS State in der letzten Woche. Dann sieht die Abfrage in Looker in etwa folgendermaßen aus:

BENUTZER BundesstaatAUFTRÄGE Anzahl
Kalifornien24
Texas5
Colorado4
Florida4
Illinois4

Wenn Sie in der Zeile Kalifornien auf 24 klicken, erwarten Sie möglicherweise, die 24 Aufträge aus Kalifornien zu sehen. Looker fügt zwar den Filter USERS State: California hinzu, weiß aber nicht, welche Felder in der Bestellung angezeigt werden sollen. Sie müssen zuerst einen Satz verwenden, um diese Felder in Ihrem Modell zu deklarieren.

In LookML ist ein Satz eine Liste von Feldnamen (Dimension, Messwert und Filter). Mit Sätzen geben Sie Looker die folgenden Informationen:

  • Die Felder, die angezeigt werden sollen, wenn Sie eine Anzahl oder einen anderen Messwert aufschlüsseln
  • Die Felder, die importiert werden sollen, wenn Sie eine Ansicht verknüpfen
  • Die Felder, die in einem Explore indexiert werden sollen

Da derselbe Satz an zahlreichen Stellen in einem Modell verwendet werden kann, gibt es in Looker verschiedene Möglichkeiten, Sätze zu erstellen.

Literalsätze

Ein Literalsatz ist eine einfache Möglichkeit, einen Satz in LookML zu definieren, insbesondere wenn der Satz nur einmal verwendet wird. Ein Literalsatz entsteht dadurch, dass der Satz als Array deklariert wird. Sie können Literalsätze mithilfe von [] deklarieren.

Dazu ein Beispiel:

view: customers {
  dimension: id {
    primary_key: yes
  }
  measure: count {
    type: count
  }
  dimension: city {}
  dimension: state {}
  dimension: name {}
}

In diesem Beispiel sind die Felder, die Sie anzeigen möchten, id, name und city.

Im Messwert können Sie ein Literal-Array so deklarieren:

measure: count {
  type: count
  drill_fields: [id, name, city]
}

Benannte Sätze

Angenommen, in der customers Ansicht sind zwei Anzahlen definiert: count und in_california_count. Wenn ein Nutzer in einem Explore entweder das Feld Count oder das Feld In California Count aufschlüsselt, sollen die Felder id, name und city angezeigt werden.

Zunächst scheint es ausreichend zu sein, diese Felder wörtlich zu deklarieren:

view: customers {
  measure: count {
    type: count
    drill_fields: [id, name, city]
  }
  measure: in_california_count {
    type: count
    filters: [state: "California"]
    drill_fields: [id, name, city]
  }
}

Wenn Sie jedoch ein neues Feld (z. B. customers.state) hinzufügen möchten, müssen Sie beide Listen bearbeiten, es sei denn, Sie haben mit dem set Parameter benannte Sätze erstellt, die Sie an einer Stelle verwalten und an mehreren Stellen verwenden können.

Mit dem folgenden Code wird ein Satz customers.detail erstellt und beide Anzahlen werden auf denselben Satz von Feldern verwiesen.

view: customers {
  set: detail {
    fields: [id, name, city]      # creates named set customers.detail
  }

  measure: count {
    type: count
    drill_fields: [detail*]       # show fields in the set "customers.detail"
  }
  measure: in_california_count {
    type: count
    filters: [state: "California"]
    drill_fields: [detail*]      # show fields in the set "customers.detail"
  }
}

LookML-Sätze sind in folgender Hinsicht leistungsstark:

  • Erneute Deklarationen von Sätzen sind additiv. Das heißt, wenn Sie einen Satz an mehreren Stellen deklarieren, dann berücksichtigt Looker alle für den Satz deklarierten Felder an allen Orten.
  • Sie können Sätze in andere Sätze einbetten, indem Sie den Namen des anderen Satzes gefolgt von einem Sternchen eingeben, z. B. setname*.
  • Sie können Elemente aus Sätzen entfernen, indem Sie vor den Feldnamen einen Bindestrich setzen, z. B. -fieldname.

Aufschlüsselungsvisualisierungen anpassen

Wenn Ihr Looker-Administrator die Visual Drilling Labs-Funktion aktiviert hat, werden Aufschlüsselungsvisualisierungen für Looks und Explores nicht immer standardmäßig als Datentabelle angezeigt. In diesem Fall können Sie die angezeigte Visualisierung anpassen, indem Sie Liquid-Variablen im link Parameter verwenden, wie auf der link Parameterdokumentationsseite und auf der Best Practices für leistungsstärkere Datenaufschlüsselung Seite beschrieben.

Dashboards unterstützen die visuelle Aufschlüsselung mit dem Parameter link, ohne dass die Labs-Funktion Visual Drilling aktiviert werden muss.

Ergebnissätze filtern

LookML bietet eine Reihe von Filtervorgängen, die auf Felder angewendet werden können, sowie Explores zum Filtern von Ergebnissätzen, bevor sie an den Benutzer übergeben werden.

always_filter für das Explore

Verwenden Sie always_filter, damit auf jede innerhalb eines Explores ausgeführte Abfrage eine Reihe von Filtern angewendet wird. Die Filter werden auf der Benutzeroberfläche von Looker angezeigt. Die Benutzer können zwar den von Ihnen vorgegebenen Standard-Filterwert ändern, die Filter jedoch nicht löschen. Im Allgemeinen werden diese Filter verwendet, um Daten zu entfernen, die Sie normalerweise nicht einbeziehen möchten. Angenommen, Sie möchten im Explore Orders nur abgeschlossene oder ausstehende Aufträge sehen. Dann können Sie den folgenden LookML-Code hinzufügen:

explore: orders {
  view_name: order
    filters: [status: "complete,pending"]
  }
}

Wenn der Benutzer Aufträge mit anderen Statuswerten abrufen möchte, könnte er die Benutzeroberfläche ORDERS Status auf % setzen.

sql_always_where für das Explore

Wenn Sie eine Abfragebeschränkung anwenden möchten, die nicht von Benutzern geändert werden kann, können Sie sql_always_where verwenden. Neben den von menschlichen Benutzern ausgeführten Abfragen gilt diese Beschränkung für Dashboards, geplante Looks und eingebettete Informationen, die auf dieses Explore zurückgreifen. Nutzer sehen die Bedingung sql_always_where nur dann, wenn sie sich den entsprechenden SQL-Code ihrer selbst erstellten Abfragen ansehen.

Das folgende Beispiel verhindert, dass Benutzer Aufträge vor dem 01.01.2012 zu sehen bekommen:

# Using Looker references
explore: order {
  sql_always_where: ${created_date} >= '2012-01-01' ;;
}

# Using raw SQL
explore: order {
  sql_always_where: DATE(created_time) >= '2012-01-01' ;;
}

conditionally_filter für das Explore

Bei besonders großen Tabellen müssen Abfragen sorgfältig überdacht werden, da eine unbegrenzte Anzahl von Abfragen schnell zu einer Belastung für die Datenbank werden kann. LookML bietet eine Möglichkeit, dieses Problem mithilfe des Parameters conditionally_filter zu beheben.

Mit dem Parameter conditionally_filter wird ein Filter auf die Abfrage angewendet, es sei denn, der Nutzer hat bereits einen Filter für eines der im Abschnitt unless aufgeführten Felder hinzugefügt.

Im folgenden Beispiel wird die Abfrage des Nutzers nicht geändert, wenn der Nutzer einen Filter für eines oder mehrere dieser Felder angewendet hat: created_date, shipped_time, shipped_date, orders.id oder customer.name. Wenn der Nutzer keinen Filter für eines dieser Felder angewendet hat, fügt Looker automatisch einen Filter von einem Tag für orders.created_time hinzu.

  filters: [orders.created_time: "1 day"]
  unless: [created_date, shipped_time, shipped_date, orders.id, customer.name]
}