Solución:
Actualización de octubre de 2019
Apoyo para Scripting y Procedimientos almacenados ahora está en versión beta (a partir de octubre de 2019)
Puede enviar varias declaraciones separadas por punto y coma y BigQuery puede ejecutarlas ahora
Ver ejemplo a continuación
DECLARE max_date TIMESTAMP;
SET max_date = (
SELECT MAX(_PARTITIONTIME) FROM project.dataset.partitioned_table`);
SELECT * FROM `project.dataset.partitioned_table`
WHERE _PARTITIONTIME = max_date;
Actualización para aquellos a quienes les gusta votar negativamente sin verificar el contexto, etc.
Creo que esta respuesta fue aceptada porque abordó la pregunta principal del OP Is there a way I can pull data only from the latest partition in BigQuery?
y en los comentarios se mencionó que es obvio que el motor BQ todavía escanea TODAS las filas pero devuelve el resultado basado en ÚNICAMENTE la partición reciente. Como ya se mencionó en el comentario para la pregunta: Still something that easily to be addressed by having that logic scripted - first getting result of subquery and then use it in final query
Tratar
SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONTIME IN (
SELECT MAX(TIMESTAMP(partition_id))
FROM [dataset.partitioned_table$__PARTITIONS_SUMMARY__]
)
o
SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONTIME IN (
SELECT MAX(_PARTITIONTIME)
FROM [dataset.partitioned_table]
)
Perdón por desenterrar esta vieja pregunta, pero surgió en una búsqueda de Google y creo que la respuesta aceptada es engañosa.
Por lo que puedo decir de la documentación y las pruebas en ejecución, la respuesta aceptada será no podar particiones porque se utiliza una subconsulta para determinar la partición más reciente:
Las consultas complejas que requieren la evaluación de varias etapas de una consulta para resolver el predicado (como consultas internas o subconsultas) no eliminarán particiones de la consulta.
Entonces, aunque la respuesta sugerida entregará los resultados esperados, aún consultará todas las particiones. Va a no ignore todas las particiones más antiguas y solo consulte las más recientes.
El truco consiste en utilizar una constante más o menos para comparar, en lugar de una subconsulta. Por ejemplo, si _PARTITIONTIME
no es irregular pero a diario, intente podar particiones obteniendo la partición de ayer así:
SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONDATE = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
Claro, estos no son siempre los datos más recientes, pero en mi caso, resultan ser lo suficientemente cercanos. Usar INTERVAL 0 DAY
si desea los datos de hoy y no le importa que la consulta devuelva 0 resultados para la parte del día en la que aún no se ha creado la partición.
¡Me alegra saber si hay una solución mejor para obtener la última partición!
Enumere todas las particiones con:
#standardSQL
SELECT
_PARTITIONTIME as pt
FROM
`[DATASET].[TABLE]`
GROUP BY 1
Y luego elija la última marca de tiempo.
Buena suerte 🙂
https://cloud.google.com/bigquery/docs/querying-partitioned-tables