Nutzung
view: my_view {
derived_table: {
sql_trigger_value: SELECT CURDATE() ;;
...
}
}
|
Hierarchie
sql_trigger_value |
Standardwert
Keine
Akzeptiert
Eine SQL-Anweisung, die eine Zeile und eine Spalte ergibt
|
Definition
Verwenden Sie stattdessen eine
datagroupund einendatagroup_trigger, die auf der Dokumentationsseite Caching von Abfragen beschrieben werden.
sql_trigger_value ermöglicht Ihnen die Neugenerierung einer persistenten abgeleiteten Tabelle basierend auf einer von Ihnen angegebenen SQL-Anweisung. Wenn das Ergebnis der SQL-Anweisung sich vom vorherigen Wert unterscheidet, wird die PDT neu generiert.
Der Parameter sql_trigger_value berücksichtigt nur die erste Zeile und Spalte in der von Ihnen geschriebenen SQL-Anweisung. Daher empfehlen wir dringend, dass Sie Ihre Abfrage so schreiben, dass nur ein Wert zurückgegeben wird (eine Zeile und eine Spalte). So werden Verwirrungen für zukünftige Entwickler vermieden und verhindert, dass nicht streamende SQL-Dialekte große Ergebnismengen in den Arbeitsspeicher laden.
Standardmäßig führt Looker alle fünf Minuten die von Ihnen geschriebene SQL-Abfrage aus, sofern keine andere persistente abgeleitete Tabelle erstellt wird. Wenn sich die Ergebnisse der SQL-Abfrage ändern, generiert Looker die abgeleitete Tabelle neu. Sie können diesen Zeitplan nach Bedarf ändern. Verwenden Sie dazu in den Administratoreinstellungen von Looker die Einstellung Wartungszeitplan für PDTs und Datengruppen.
Angenommen, Sie verwenden MySQL und Folgendes:
sql_trigger_value: SELECT CURDATE() ;;
Die Ergebnisse sehen so aus:
| sql_trigger_value-Laufzeit | sql_trigger_value-Ergebnis |
|---|---|
| 2015-01-01 00:00 | 2015-01-01 |
| 2015-01-01 00:05 | 2015-01-01 |
| 2015-01-01 00:10 | 2015-01-01 |
| … | … |
| 2015-01-01 23:55 | 2015-01-01 |
| 2015-01-02 00:00 | 2015-01-02 |
| 2015-01-02 00:05 | 2015-01-02 |
Der Wert dieser SQL-Abfrage ändert sich einmal täglich um Mitternacht. Die abgeleitete Tabelle wird also zu diesen Zeiten neu generiert.
Looker führt keine Zeitzonenumwandlung für
sql_trigger_valuedurch. Wenn Siesql_trigger_valueverwenden, um eine PDT-Neuerstellung um Mitternacht oder zu einer bestimmten Tageszeit auszulösen, erfolgt der Trigger in der Zeitzone, für die Ihre Datenbank konfiguriert ist.
Wenn Ihr Administrator Ihnen die develop Berechtigung gewährt hat, können Sie die Neuerstellung einer abgeleiteten Tabelle erzwingen, bevor sich die sql_trigger_value Abfrage geändert hat. Wählen Sie nach dem Ausführen einer Abfrage im Zahnradmenü Explore-Aktionen die Option Abgeleitete Tabellen neu erstellen und ausführen aus.
Weitere Informationen zur Option Abgeleitete Tabellen neu erstellen und ausführen finden Sie auf der Dokumentationsseite Abgeleitete Tabellen in Looker.
Beispiele
Eine PDT in MySQL erstellen, die einmal täglich um Mitternacht neu erstellt wird:
view: clean_events {
derived_table: {
sql:
SELECT *
FROM events
WHERE type NOT IN ('test', 'staff') ;;
sql_trigger_value: SELECT CURDATE() ;;
}
}
In den folgenden Abschnitten wird die SQL-Anweisung für verschiedene PDT-Neuerstellungsstrategien in verschiedenen Dialekten gezeigt:
Google BigQuery
| Gewünschter Zeitplan für die Neuerstellung | Zu verwendende SQL-Anweisung |
|---|---|
| Einmal täglich um Mitternacht (Pacific Time) | SELECT FORMAT_TIMESTAMP('%F', CURRENT_TIMESTAMP(), 'America/Los_Angeles') |
| Einmal täglich zu einer bestimmten Stunde | SELECT FLOOR(((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) - 60*60*3)/(60*60*24)) |
| Zweimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Dreimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Stündlich | SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP()) |
| Alle zwei Stunden | SELECT FLOOR((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) / (2*60*60)) |
| Daten nie aktualisieren | SELECT 1 |
MySQL
| Gewünschter Zeitplan für die Neuerstellung | Zu verwendende SQL-Anweisung |
|---|---|
| Einmal täglich um Mitternacht | SELECT CURDATE() |
| Einmal täglich zu einer bestimmten Stunde (koordinierte Weltzeit, UTC) | SELECT FLOOR((UNIX_TIMESTAMP(NOW()) - 60*60*3)/(60*60*24)) |
| Zweimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Dreimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Wenn eine bestimmte Tabelle aktualisiert wird | SELECT COUNT(*) FROM table |
| Stündlich | SELECT HOUR(CURTIME()) |
| Alle zwei Stunden (koordinierte Weltzeit, UTC) | SELECT FLOOR(UNIX_TIMESTAMP() / (2*60*60)) |
| Daten nie aktualisieren | SELECT 1 |
Amazon Redshift
| Gewünschter Zeitplan für die Neuerstellung | Zu verwendende SQL-Anweisung |
|---|---|
| Einmal täglich um Mitternacht | SELECT CURRENT_DATE |
| Einmal täglich zu einer bestimmten Stunde | SELECT FLOOR((EXTRACT(epoch from GETDATE()) - 60*60*3)/(60*60*24)) |
| Zweimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Dreimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Wenn eine bestimmte Tabelle aktualisiert wird | SELECT COUNT(*) FROM table |
| Stündlich | SELECT DATE_PART('hour', GETDATE()) |
| Alle zwei Stunden | SELECT FLOOR(EXTRACT(epoch from GETDATE()) / (2*60*60)) |
| Daten nie aktualisieren | SELECT 1 |
PostgreSQL
| Gewünschter Zeitplan für die Neuerstellung | Zu verwendende SQL-Anweisung |
|---|---|
| Einmal täglich um Mitternacht | SELECT CURRENT_DATE |
| Einmal täglich zu einer bestimmten Stunde | SELECT FLOOR((EXTRACT(epoch from NOW()) - 60*60*3)/(60*60*24)) |
| Zweimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Dreimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Wenn eine bestimmte Tabelle aktualisiert wird | SELECT COUNT(*) FROM table |
| Stündlich | SELECT DATE_PART('hour', NOW()) |
| Alle zwei Stunden | SELECT FLOOR(EXTRACT(epoch from NOW()) / (2*60*60)) |
| Daten nie aktualisieren | SELECT 1 |
Snowflake
| Gewünschter Zeitplan für die Neuerstellung | Zu verwendende SQL-Anweisung |
|---|---|
| Einmal täglich um Mitternacht | SELECT CURRENT_DATE() |
| Einmal täglich zu einer bestimmten Stunde (koordinierte Weltzeit, UTC) | SELECT FLOOR((DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) - 60*60*3)/(60*60*24)) |
| Zweimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Dreimal täglich zu bestimmten Stunden | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| Wenn eine bestimmte Tabelle aktualisiert wird | SELECT COUNT(*) FROM table |
| Stündlich | SELECT HOUR(CURRENT_TIME()) |
| Alle zwei Stunden (koordinierte Weltzeit, UTC) | SELECT FLOOR(DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) / (2*60*60)) |
| Daten nie aktualisieren | SELECT 1 |
Häufige Herausforderungen
Für sql_trigger_value müssen persistente abgeleitete Tabellen eingerichtet sein
Wenn Sie sql_trigger_value verwenden, werden LookML-Validierungsfehler verursacht, es sei denn, Sie haben die Persistenz für abgeleitete Tabellen aktiviert in den Einstellungen für die Datenbankverbindung. Die meisten Kunden richten persistente abgeleitete Tabellen ein, wenn sie eine Datenbankverbindung zum ersten Mal konfigurieren. Die häufigste Ausnahme von dieser Regel sind Kunden, die Looker mit einer schreibgeschützten, Hot-Swap-fähigen sekundären PostgreSQL-Datenbank verbinden.
sql_trigger_value funktioniert im Entwicklungsmodus und im Produktionsmodus unterschiedlich
sql_trigger_value sollte im Produktionsmodus wie erwartet funktionieren. Im Entwicklungsmodus werden alle abgeleiteten Tabellen so behandelt, als ob persist_for: 24 hours verwendet wurde, unabhängig von der von Ihnen implementierten Einstellung. Weitere Informationen finden Sie im Abschnitt Persistente Tabellen im Entwicklungsmodus auf der Dokumentationsseite Abgeleitete Tabellen in Looker.