Je modélise des traits (ou attributs) dans Bigquery. Voici un exemple de modèle
uid string, link to owner id
uuid string, unique among all rows
trait_name string, name of the trait
trait_value string
added_at timestamp, when the trait was added
J'essaie de construire une vue matérialisée qui contient le dernier trait pour chaque trait de chaque Uid. Je suis capable d'obtenir le résultat avec cette requête :
WITH traits AS (
SELECT 'u1' uid, 'uu1' uuid, 't1' trait_name, 't1v1' trait_value, timestamp("2021-10-01 10:00:00") as added_at UNION ALL
SELECT 'u1' uid, 'uu2' uuid, 't1' trait_name, 't1v2' trait_value, timestamp("2021-10-02 10:00:00") as added_at UNION ALL
SELECT 'u1' uid, 'uu3' uuid, 't2' trait_name, 't2v1' trait_value, timestamp("2021-10-03 10:00:00") as added_at UNION ALL
SELECT 'u1' uid, 'uu4' uuid, 't2' trait_name, 't2v2' trait_value, timestamp("2021-10-04 10:00:00") as added_at UNION ALL
SELECT 'u2' uid, 'uu5' uuid, 't1' trait_name, 't1v1' trait_value, timestamp("2021-10-05 10:00:00") as added_at UNION ALL
SELECT 'u2' uid, 'uu6' uuid, 't1' trait_name, 't1v2' trait_value, timestamp("2021-10-06 10:00:00") as added_at UNION ALL
SELECT 'u2' uid, 'uu7' uuid, 't2' trait_name, 't2v1' trait_value, timestamp("2021-10-07 10:00:00") as added_at UNION ALL
SELECT 'u2' uid, 'uu8' uuid, 't2' trait_name, 't2v2' trait_value, timestamp("2021-10-08 10:00:00") as added_at
)
SELECT * FROM (
SELECT *,
MAX(added_at) OVER (PARTITION BY uid, trait_name) as latest_added_at FROM traits
) WHERE latest_added_at = added_at
# Row uid uuid trait_name trait_value added_at latest_added_at
# 1 u1 uu2 t1 t1v2 2021-10-02 10:00:00 UTC 2021-10-02 10:00:00 UTC
# 2 u1 uu4 t2 t2v2 2021-10-04 10:00:00 UTC 2021-10-04 10:00:00 UTC
# 3 u2 uu6 t1 t1v2 2021-10-06 10:00:00 UTC 2021-10-06 10:00:00 UTC
# 4 u2 uu8 t2 t2v2 2021-10-08 10:00:00 UTC 2021-10-08 10:00:00 UTC
Mais je ne peux pas l'utiliser pour les vues matérialisées car elles ne le supportent pas :
Les vues matérialisées ne supportent pas les fonctions analytiques ou WITH OFFSET.
J'ai également essayé d'utiliser des jointures
SELECT * FROM traits t
JOIN (
SELECT
uid,
trait_name,
MAX(added_at) AS max_added_at
FROM traits GROUP BY uid, trait_name
) grouped
ON t.uid = grouped.uid
AND t.trait_name = grouped.trait_name
AND t.added_at = grouped.max_added_at
Mais ils ne sont pas non plus soutenus
Les requêtes de vues matérialisées ne peuvent pas référencer la même table plus d'une fois. Les traits de la table ont été vus plusieurs fois.
Y a-t-il un moyen de le faire en tant que vue matérialisée ?