Une table dérivée est une requête dont les résultats sont utilisés comme s'il s'agissait d'une table physique dans la base de données. Une table dérivée native est basée sur une requête que vous définissez à l'aide de termes LookML. Ce tableau est différent d'une table dérivée de SQL, qui est basée sur une requête que vous définissez avec des termes SQL. Comparées aux tables dérivées basées sur SQL, les tables dérivées natives sont beaucoup plus faciles à lire et à comprendre lors de la modélisation des données. Pour en savoir plus, consultez la section Tables dérivées natives et tables dérivées SQL de la page de documentation Tables dérivées dans Looker.
Les tables dérivées natives et les tables SQL sont définies dans LookML à l'aide du paramètre derived_table
au niveau de la vue. En revanche, avec les tables dérivées natives, il est inutile de créer une requête SQL. À la place, utilisez le paramètre explore_source
pour spécifier l'exploration sur laquelle baser la table dérivée, les colonnes souhaitées et d'autres caractéristiques souhaitées.
Vous pouvez également demander à Looker de créer la table dérivée LookML à partir d'une requête SQL Runner, comme décrit sur la page de documentation Utiliser SQL Runner pour créer des tables dérivées.
Définition de vos tables dérivées natives à partir d'une exploration
À partir d'une exploration, Looker peut générer un code LookML pour tout ou partie d'une table dérivée. Il suffit de créer une exploration et de sélectionner tous les champs souhaités dans la table. Ensuite, pour générer le code LookML de la table dérivée native :
Cliquez sur le menu représenté par une roue dentée et sélectionnez Obtenir LookML.
Cliquez sur l'onglet Table dérivée pour afficher le lookML permettant de créer une table dérivée native pour l'exploration.
Copiez le code LookML.
Après avoir copié le code LookML généré, collez-le dans un fichier de vue :
En mode Développement, accédez aux fichiers de votre projet.
Cliquez sur + en haut de la liste des fichiers de projet dans l'IDE Looker, puis sélectionnez Créer une vue. Vous pouvez également cliquer sur le menu d'un dossier et sélectionner Créer une vue dans le menu pour créer le fichier dans le dossier.
Donnez un nom représentatif à la vue.
Au besoin, changez le nom des colonnes, désignez des colonnes dérivées et ajoutez des filtres.
Lorsque vous utilisez une mesure de
type: count
dans une exploration, la visualisation étiquette les valeurs obtenues avec le nom de la vue au lieu du mot Nombre. Pour éviter toute confusion, nous vous recommandons de donner votre nom à la vue en entier, de sélectionner Afficher le nom complet du champ sous Série dans les paramètres de la visualisation, ou d'utiliser uneview_label
avec une version au pluriel de votre nom de vue.
Définition d'une table dérivée native dans LookML
Que vous utilisiez des tables dérivées déclarées en SQL ou en mode LookML natif, la sortie d'une requête derived_table
&s39;s est une table comportant un ensemble de colonnes. Si la table dérivée est exprimée en SQL, les noms de ces colonnes de sortie sont implicitement fournis par la requête SQL. Par exemple, la requête SQL ci-dessous comportera les colonnes de sortie user_id
, lifetime_number_of_orders
et lifetime_customer_value
:
SELECT
user_id
, COUNT(DISTINCT order_id) as lifetime_number_of_orders
, SUM(sale_price) as lifetime_customer_value
FROM order_items
GROUP BY 1
Dans Looker, les requêtes sont basées sur une exploration, incluent des champs de mesure et de dimension, ajoutent si nécessaire des filtres, et peuvent même indiquer un ordre de tri. Une table dérivée native contient tous ces éléments, ainsi que les noms de sortie des colonnes.
L'exemple simple ci-dessous génère une table dérivée à trois colonnes: user_id
, lifetime_customer_value
et lifetime_number_of_orders
. Vous n'avez pas besoin d'écrire la requête manuellement en SQL. Looker crée la requête à votre place à l'aide de l'order_items
d'exploration spécifié et de certains champs de cette exploration (order_items.user_id
, order_items.total_revenue
et order_items.order_count
).
view: user_order_facts {
derived_table: {
explore_source: order_items {
column: user_id {
field: order_items.user_id
}
column: lifetime_number_of_orders {
field: order_items.order_count
}
column: lifetime_customer_value {
field: order_items.total_revenue
}
}
}
# Define the view's fields as desired
dimension: user_id {
hidden: yes
}
dimension: lifetime_number_of_orders {
type: number
}
dimension: lifetime_customer_value {
type: number
}
}
Utiliser des instructions include
pour activer les champs de référence
Dans le fichier de vue de la table dérivée native, vous utilisez le paramètre explore_source
pour pointer vers une exploration, et pour définir les colonnes souhaitées et d'autres caractéristiques souhaitées pour la table dérivée native. Comme vous placez le curseur de la souris sur une exploration à partir du fichier de vue native de la table dérivée, vous devez également inclure le fichier contenant la définition de l'exploration. Les explorations sont généralement définies dans un fichier de modèle, mais dans le cas des tables dérivées natives, il est plus simple de créer un fichier distinct pour l'exploration à l'aide de l'extension de fichier .explore.lkml
, comme décrit dans la documentation sur la création de fichiers d'exploration. De cette façon, vous pouvez inclure un unique fichier d'exploration dans le fichier de vue de votre table dérivée native, plutôt que l'intégralité du fichier de modèle. Dans ce cas :
- Le fichier de vue dérivé de la table native doit inclure le fichier Explorer. Exemple:
include: "/explores/order_items.explore.lkml"
- Le fichier Explorer doit inclure les fichiers de vue dont il a besoin. Exemple:
include: "/views/order_items.view.lkml"
include: "/views/users.view.lkml"
- Le modèle doit inclure le fichier Explorer. Exemple:
include: "/explores/order_items.explore.lkml"
Les fichiers Explorer écoutent la connexion du modèle dans lequel ils sont inclus. Pensez-y lorsque vous incluez des fichiers Explorer dans des modèles configurés avec une connexion différente de celle du modèle parent du fichier Explorer. Si le schéma de la connexion du modèle inclus diffère de celui de la connexion du modèle parent, des erreurs de requête peuvent se produire.
Définition de colonnes d'une table dérivée native
Comme indiqué dans l'exemple ci-dessus, vous spécifiez les colonnes de sortie de la table dérivée à l'aide de column
.
Spécification des noms de colonnes
Pour la colonne user_id
, le nom de la colonne correspond au nom du champ spécifié dans l'exploration d'origine.
En général, vous souhaitez que les colonnes de la table de sortie portent un nom différent de celui des champs de l'exploration d'origine. Dans l'exemple ci-dessus, nous effectuons un calcul de la valeur vie client par utilisateur à l'aide de la fonction order_items
Explorer. Dans la table de sortie, total_revenue
est réellement un lifetime_customer_value
du client.
La déclaration column
permet de déclarer un nom de sortie différent du champ de saisie. Par exemple, le code ci-dessous indique que vous devez créer une colonne de sortie nommée lifetime_value
à partir du champ order_items.total_revenue
:
column: lifetime_value {
field: order_items.total_revenue
}
Noms de colonnes implicites
Si le paramètre field
est omis d'une déclaration de colonne, la valeur par défaut est <explore_name>.<field_name>
. Par exemple, si vous avez spécifié explore_source: order_items
,
column: user_id {
field: order_items.user_id
}
équivaut à
column: user_id {}
Création de colonnes dérivées pour des valeurs calculées
Vous pouvez ajouter des paramètres derived_column
pour spécifier les colonnes qui n'existent pas dans le paramètre explore_source
"Explorer". Chaque paramètre derived_column
comporte un paramètre sql
spécifiant comment construire la valeur.
Votre calcul sql
peut utiliser toutes les colonnes que vous avez spécifiées à l'aide des paramètres column
. Les colonnes dérivées ne peuvent pas inclure de fonctions d'agrégation, mais peuvent en revanche contenir des calculs réalisables sur une seule ligne de la table.
L'exemple ci-dessous produit le même tableau dérivé que le précédent, sauf qu'il ajoute une colonne average_customer_order
calculée, calculée à partir des colonnes lifetime_customer_value
et lifetime_number_of_orders
de la table dérivée native.
view: user_order_facts {
derived_table: {
explore_source: order_items {
column: user_id {
field: order_items.user_id
}
column: lifetime_number_of_orders {
field: order_items.order_count
}
column: lifetime_customer_value {
field: order_items.total_revenue
}
derived_column: average_customer_order {
sql: lifetime_customer_value / lifetime_number_of_orders ;;
}
}
}
# Define the view's fields as desired
dimension: user_id {
hidden: yes
}
dimension: lifetime_number_of_orders {
type: number
}
dimension: lifetime_customer_value {
type: number
}
dimension: average_customer_order {
type: number
}
}
Utilisation des fonctions de fenêtrage SQL
Certains dialectes de base de données prennent en charge les fonctions de fenêtrage, en particulier pour créer des numéros de séquence, des clés primaires, des totaux cumulés et cumulés, ainsi que d'autres calculs utiles sur plusieurs lignes. Une fois la requête principale exécutée, toutes les déclarations derived_column
sont exécutées dans un autre élément.
Si votre dialecte de base de données prend en charge les fonctions de fenêtrage, vous pouvez les utiliser dans votre table dérivée native. Créez un paramètre derived_column
avec un paramètre sql
contenant la fonction de fenêtrage souhaitée. Pour référencer ces valeurs, vous devez utiliser le nom de colonne défini dans la table dérivée native.
L'exemple ci-dessous crée une table dérivée native qui inclut les colonnes user_id
, order_id
et created_time
. Ensuite, à l'aide d'une colonne dérivée d'un fenêtrage SQL ROW_NUMBER()
, une colonne contenant le numéro de séquence d'une commande client est calculée.
view: user_order_sequences {
derived_table: {
explore_source: order_items {
column: user_id {
field: order_items.user_id
}
column: order_id {
field: order_items.order_id
}
column: created_time {
field: order_items.created_time
}
derived_column: user_sequence {
sql: ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_time) ;;
}
}
}
dimension: order_id {
hidden: yes
}
dimension: user_sequence {
type: number
}
}
Ajout de filtres à une table dérivée native
Supposons que nous voulions créer une table dérivée de la valeur d'un client au cours des 90 derniers jours. Nous souhaitons effectuer les mêmes calculs que précédemment, mais en ne tenant compte que des achats des 90 derniers jours.
Nous ajoutons simplement un filtre à derived_table
qui filtre les transactions des 90 derniers jours. Le paramètre filters
d'une table dérivée utilise la même syntaxe que celle que vous utilisez pour créer une mesure filtrée.
view: user_90_day_facts {
derived_table: {
explore_source: order_items {
column: user_id {
field: order_items.user_id
}
column: number_of_orders_90_day {
field: order_items.order_count
}
column: customer_value_90_day {
field: order_items.total_revenue
}
filters: [order_items.created_date: "90 days"]
}
}
# Add define view's fields as desired
dimension: user_id {
hidden: yes
}
dimension: number_of_orders_90_day {
type: number
}
dimension: customer_value_90_day {
type: number
}
}
Les filtres seront ajoutés à la clause WHERE
lorsque Looker écrit le code SQL pour la table dérivée.
En outre, vous pouvez utiliser le sous-paramètre dev_filters
de explore_source
avec une table dérivée native. Le paramètre dev_filters
vous permet de spécifier des filtres que Looker applique uniquement aux versions de développement de la table dérivée. Vous pouvez ainsi créer des versions filtrées plus petites de la table à itérer et tester sans attendre que la table complète soit créée après chaque modification.
Le paramètre dev_filters
fonctionne conjointement avec le paramètre filters
. Ainsi, tous les filtres sont appliqués à la version de développement du tableau. Si dev_filters
et filters
spécifient tous deux des filtres pour la même colonne, dev_filters
est prioritaire pour la version de développement de la table.
Pour en savoir plus, consultez la section Travailler plus rapidement en mode de développement.
Utilisation de filtres basés sur un modèle
Vous pouvez utiliser bind_filters
pour inclure des filtres modélisés :
bind_filters: {
to_field: users.created_date
from_field: filtered_lookml_dt.filter_date
}
Cela revient essentiellement à utiliser le code suivant dans un bloc sql
:
{% condition filtered_lookml_dt.filter_date %} users.created_date {% endcondition %}
to_field
est le champ auquel s'applique le filtre. to_field
doit être un champ de la propriété explore_source
sous-jacente.
from_field
spécifie le champ à partir duquel obtenir le filtre, s'il en existe un au moment de l'exécution.
Dans l'exemple bind_filters
ci-dessus, Looker utilise tout filtre appliqué au champ filtered_lookml_dt.filter_date
et l'applique au champ users.created_date
.
Vous pouvez également utiliser le sous-paramètre bind_all_filters
de explore_source
pour transmettre tous les filtres d'exécution d'une requête Explorer à une sous-requête de table native dérivée. Pour en savoir plus, consultez la page de documentation sur les paramètres explore_source
.
Tri et limitation des tables dérivées natives
Vous pouvez également trier et limiter les tables dérivées, si vous le souhaitez:
sorts: [order_items.count: desc]
limit: 10
N'oubliez pas qu'une exploration peut présenter les lignes dans un ordre différent de l'ordre de tri sous-jacent.
Conversion de tables NDT dans différents fuseaux horaires
Vous pouvez spécifier le fuseau horaire de votre table dérivée native à l'aide du sous-paramètre timezone
:
timezone: "America/Los_Angeles"
Lorsque vous utilisez le sous-paramètre timezone
, toutes les données temporelles de la table dérivée native sont converties au fuseau horaire que vous spécifiez. Consultez la page de documentation sur les valeurs timezone
pour obtenir la liste des fuseaux horaires acceptés.
Si vous ne spécifiez pas de fuseau horaire dans la définition de votre table dérivée native, celle-ci n'effectue aucune conversion de fuseau horaire sur les données temporelles. En revanche, les données basées sur l'heure sont définies par défaut sur le fuseau horaire de votre base de données.
Si la table dérivée native n'est pas persistante, vous pouvez définir la valeur du fuseau horaire sur "query_timezone"
pour utiliser automatiquement le fuseau horaire de la requête en cours d'exécution.