Decoradores de tabla en SQL heredado

En este documento, se detalla cómo usar decoradores de tabla en la sintaxis de consultas de SQL heredado. La sintaxis de la consulta preferida para BigQuery es SQL estándar. En la actualidad, los decoradores de tablas no son compatibles con SQL estándar, pero puedes lograr la semántica de decorador de tablas en SQL estándar mediante un filtro en la seudocolumna _TABLE_SUFFIX. Para obtener más información, consulta Decoradores de tabla y funciones comodín en la guía de migración de SQL estándar.

Por lo general, BigQuery realiza un análisis de la columna completa cuando se ejecuta una consulta. Puedes usar los decoradores de tabla en SQL heredado para realizar una consulta más rentable de un subconjunto de tus datos. Los decoradores de tabla se pueden usar siempre que se lea una tabla, como cuando se copia o se exporta una tabla o se enumeran datos con tabledata.list.

Los decoradores de tablas admiten valores <time> relativos y absolutos. Un número negativo indica los valores relativos y un número positivo indica valores absolutos. Por ejemplo, -3600000 indica una hora antes en milisegundos, relacionada con la hora actual. 3600000 indica una hora en milisegundos después del 1/1/1970.

Decoradores de instantáneas

Sintaxis

@<time>
  • Hace referencia a una instantánea de la tabla en <time>, en milisegundos desde el ciclo de entrenamiento.
  • <time> debe estar dentro de los últimos 7 días y ser superior o igual que la hora de creación de la tabla.
  • @0 es un caso especial que hace referencia a la instantánea más antigua posible de la tabla: ya sea 7 días en el pasado o la hora de creación de la tabla si la tabla tiene menos de 7 días.
  • Los decoradores de instantáneas son compatibles solo con las operaciones de copia de tablas. Para las operaciones de consulta, usa FOR SYSTEM_TIME AS OF.

Puedes usar decoradores de instantáneas para recuperar una tabla dentro de los 7 días posteriores a su eliminación.

Ejemplos

Para obtener una instantánea de la tabla de una hora antes, haz lo siguiente:

Ejemplo de valor relativo

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000]

Ejemplo de valor absoluto

  1. Obtén <time> para una hora antes:

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. Luego, reemplaza <time> en la siguiente consulta:

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time]
    

Para recuperar una tabla mediante un decorador de instantáneas y la herramienta de línea de comandos de bq, sigue estas instrucciones:

Ejemplo de recuperación de tabla

Primero, determina una marca de tiempo antes de que se borre la tabla (en milisegundos desde el ciclo de entrenamiento). Luego, copia la tabla en esa marca de tiempo a la tabla nueva. La tabla nueva debe tener un nombre distinto al de la tabla borrada.

# Create a table "dataset1.table1"
$ bq query --destination_table=dataset1.table1 "select 1"

# Get current timestamp
$ date +%s%3N
1573060348222

# Delete table1
$ bq rm dataset1.table1

# Undelete table
$ bq cp dataset1.table1@1573060348222 dataset1.table1_restore

Decoradores de rango

Sintaxis

@<time1>-<time2>
  • Datos de la tabla de referencias agregados entre <time1> y <time2>, en milisegundos desde el ciclo de entrenamiento
  • <time1> y <time2> deben estar dentro de los últimos 7 días
  • <time2> es opcional y se establece de forma predeterminada en "ahora".

Ejemplos

Ejemplos de valores relativos

Para obtener datos de tabla agregados entre una hora y media hora antes, haz lo siguiente:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000--1800000]

Para obtener los datos de los últimos 10 minutos, haz lo siguiente:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-600000-]

Ejemplo de valor absoluto

Para obtener datos de tabla agregados entre una hora y media hora antes, haz lo siguiente:

  1. Obtén <time1> para una hora antes:

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. Obtén <time2> para media hora antes:

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -30, 'MINUTE')/1000)
    
  3. Reemplaza <time1> y <time2> en la siguiente consulta:

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time1-time2]