2017-10-19 8 views
0

J'ai une table avec identifiant et le nomBigQuery standard Sql équivalent au dernier() du legs Sql

id | name 
---------- 
1 | apple 
1 | banana 
2 | carrot 
3 | lemon 
3 | orange 

Legacy Sql, on pourrait écrire une déclaration comme

SELECT 
    id, 
    LAST(name) AS last_record_of_name, 
FROM 
    [project:table] 
GROUP BY 1 

et le résultat serait être

id | last_record_of_name 
---------- 
1 | banana 
2 | carrot 
3 | orange 

Cela profite de la fonction LAST https://cloud.google.com/bigquery/docs/reference/legacy-sql#last

Existe-t-il une fonction similaire si vous utilisez le SQL standard dans BigQuery?

Répondre

4

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.