La chose à propos de LAST
à partir de SQL hérité est que la sortie n'est pas définie pour l'exemple que vous avez donné; il ne spécifie pas comment "last" est déterminé dans ce cas car le balayage de la table d'entrée n'est pas garanti pour avoir un ordre particulier. Comme il est écrit, vous pouvez exprimer cette même requête avec ANY_VALUE
de SQL standard dans BigQuery, .: par exemple
WITH SampleInput AS (
SELECT 1 AS id, 'apple' AS name UNION ALL
SELECT 1, 'banana' UNION ALL
SELECT 2, 'carrot' UNION ALL
SELECT 3, 'lemon' UNION ALL
SELECT 3, 'orange'
)
SELECT
id,
ANY_VALUE(name) AS last_record_of_name
FROM SampleInput
GROUP BY id;
+----+---------------------+
| id | last_record_of_name |
+----+---------------------+
| 1 | apple |
| 2 | carrot |
| 3 | lemon |
+----+---------------------+
Je ne pense pas que ce soit ce que vous êtes après, bien; si le but est d'obtenir la « dernière » valeur en fonction de certains critères, tels que l'ordre de tri des valeurs name
, vous pouvez utiliser ARRAY_AGG
avec ORDER BY
et LIMIT 1
, par exemple:
WITH SampleInput AS (
SELECT 1 AS id, 'apple' AS name UNION ALL
SELECT 1, 'banana' UNION ALL
SELECT 2, 'carrot' UNION ALL
SELECT 3, 'lemon' UNION ALL
SELECT 3, 'orange'
)
SELECT
id,
ARRAY_AGG(name ORDER BY name DESC LIMIT 1)[OFFSET(0)] AS last_record_of_name
FROM SampleInput
GROUP BY id;
+----+---------------------+
| id | last_record_of_name |
+----+---------------------+
| 1 | banana |
| 2 | carrot |
| 3 | orange |
+----+---------------------+
Le comportement de la requête est bien défini et donne les résultats souhaités en fonction de l'entrée et de la sortie de votre échantillon.