Cómo escribir una consulta de estadísticas de Places

Para acceder a los datos de Places Insights, escribe consultas en SQL en BigQuery que devuelvan estadísticas agregadas sobre lugares. Los resultados se devuelven del conjunto de datos para los criterios de búsqueda especificados en la consulta.

Requisitos de la búsqueda

La declaración SELECT en la consulta debe incluir WITH AGGREGATION_THRESHOLD y especificar el conjunto de datos. Por ejemplo:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`

En este ejemplo, usas FROM para especificar el conjunto de datos places_insights___us___sample.places_sample de Estados Unidos.

Cómo especificar una restricción de ubicación

Ten en cuenta que la consulta anterior no especifica ninguna restricción de ubicación, lo que significa que la agregación de datos se aplica a todo el conjunto de datos. Por lo general, se especifica una restricción de ubicación como la que se muestra a continuación:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`
WHERE
ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)

En este ejemplo, tu búsqueda especifica una restricción de segmentación centrada en el Empire State Building de la ciudad de Nueva York, con un radio de 1,000 metros.

Puedes usar un polígono para especificar el área de búsqueda. Cuando se usa un polígono, sus puntos deben definir un bucle cerrado en el que el primer punto del polígono sea el mismo que el último:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`
WHERE
ST_CONTAINS(ST_GEOGFROMTEXT("""POLYGON((-73.985708 40.75773,-73.993324 40.750298,
                                      -73.9857 40.7484,-73.9785 40.7575,
                                      -73.985708 40.75773))"""), point)

En el siguiente ejemplo, definirás el área de búsqueda con una línea de puntos conectados. La línea es similar a una ruta de viaje calculada por la API de Routes. La ruta puede ser para un vehículo, una bicicleta o un peatón:

DECLARE route GEOGRAPHY;

SET route = ST_GEOGFROMTEXT("""LINESTRING(-73.98903537033028 40.73655649223003,
                                          -73.93580216278471 40.80955538843361)""");

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`
WHERE
  ST_DWITHIN(route, point, 100)

En este ejemplo, estableces el radio de búsqueda en 100 metros alrededor de la línea.

Filtra por campos del conjunto de datos de lugares

Define mejor tu búsqueda en función de los campos definidos por el esquema del conjunto de datos. Filtrar los resultados según los campos del conjunto de datos, como lugar regular_opening_hours, price_level y cliente rating

Haz referencia a cualquier campo del conjunto de datos definido por el esquema del conjunto de datos para el país que te interesa. El esquema del conjunto de datos de cada país consta de dos partes:

Por ejemplo, tu consulta puede incluir una cláusula WHERE que defina los criterios de filtrado para la consulta. En el siguiente ejemplo, se muestran los datos de agregación para los lugares del tipo restaurant con un business_status de OPERATIONAL, que tienen un rating mayor o igual que 4.0 y con allows_dogs establecido en true:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`
WHERE
ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
AND 'restaurant' IN UNNEST(types)
AND business_status = "OPERATIONAL"
AND rating >= 4.0
AND allows_dogs = true

La siguiente consulta devuelve resultados para lugares que tienen al menos ocho estaciones de carga de VE:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `places_insights___us___sample.places_sample`
WHERE
  ev_charge_options.connector_count > 8;

Filtra por tipo principal de lugar y tipo de lugar

Cada lugar del conjunto de datos puede tener lo siguiente:

  • Un solo tipo principal asociado a él de los tipos definidos por la Tabla A. Por ejemplo, el tipo principal podría ser mexican_restaurant o steak_house. Usa primary_type en una búsqueda para filtrar los resultados según el tipo principal de un lugar.

  • Varios valores de tipo asociados a él de los tipos definidos por la tabla A. Por ejemplo, un restaurante puede tener los siguientes tipos: seafood_restaurant, restaurant, food, point_of_interest y establishment. Usa types en una búsqueda para filtrar los resultados en la lista de tipos asociados con el lugar.

La siguiente consulta devuelve resultados para todos los lugares con un tipo principal de bar, pero que también funcionan como restaurant:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `places_insights___us___sample.places_sample`
WHERE
  'restaurant' IN UNNEST(types)
  AND 'bar' = primary_type

Filtrar los valores de datos predefinidos

Muchos campos del conjunto de datos tienen valores predefinidos. Por ejemplo:

  • El campo price_level admite los siguientes valores predefinidos:

    • PRICE_LEVEL_FREE
    • PRICE_LEVEL_INEXPENSIVE
    • PRICE_LEVEL_MODERATE
    • PRICE_LEVEL_EXPENSIVE
    • PRICE_LEVEL_VERY_EXPENSIVE
  • El campo business_status admite los siguientes valores predefinidos:

    • OPERATIONAL
    • CLOSED_TEMPORARILY
    • CLOSED_PERMANENTLY

En este ejemplo, la consulta devuelve el recuento de todos los restaurantes con un business_status de OPERATIONAL en un radio de 1,000 metros del Empire State Building en la ciudad de Nueva York:

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`
WHERE
ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
AND business_status = "OPERATIONAL"
AND 'restaurant' IN UNNEST(types)

Filtrar por horario de atención

En este ejemplo, se muestra el recuento de todos los lugares en un área geográfica con horas felices los viernes:

SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count
FROM `places_insights___us___sample.places_sample`,
UNNEST(regular_opening_hours_happy_hour.friday) AS friday_hours
WHERE '17:00:00' BETWEEN friday_hours.start_time AND friday_hours.end_time
AND ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000);

Usa una función de agregación

En el siguiente ejemplo, se muestran las funciones de agregación de BigQuery compatibles. Esta consulta agrega las calificaciones de todos los lugares ubicados en un radio de 1,000 metros del Empire State Building en la ciudad de Nueva York para generar estadísticas de calificaciones:

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(id) AS place_count,
  APPROX_COUNT_DISTINCT(rating) as distinct_ratings,
  COUNTIF(rating > 4.0) as good_rating_count,
  LOGICAL_AND(rating <= 5) as all_ratings_equal_or_below_five,
  LOGICAL_OR(rating = 5) as any_rating_exactly_five,
  AVG(rating) as avg_rating,
  SUM(user_rating_count) as rating_count,
  COVAR_POP(rating, user_rating_count) as rating_covar_pop,
  COVAR_SAMP(rating, user_rating_count) as rating_covar_samp,
  STDDEV_POP(rating) as rating_stddev_pop,
  STDDEV_SAMP(rating) as rating_stddev_samp,
  VAR_POP(rating) as rating_var_pop,
  VAR_SAMP(rating) as rating_var_samp,
FROM
  `places_insights___us___sample.places_sample`
WHERE
  ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
  AND business_status = "OPERATIONAL"

Devuelve grupos de resultados

Las consultas que se mostraron hasta ahora devuelven una sola fila en el resultado que contiene el recuento de agregación para la consulta. También puedes usar el operador GROUP BY para devolver varias filas en la respuesta según los criterios de agrupación.

Por ejemplo, la siguiente consulta devuelve resultados agrupados por el tipo principal de cada lugar en el área de búsqueda:

SELECT WITH AGGREGATION_THRESHOLD
  primary_type,
  COUNT(*) AS count
FROM
  `places_insights___us___sample.places_sample`
WHERE
  ST_DWITHIN(ST_GEOGPOINT(-73.99992071622756, 40.71818785986936), point, 1000)
GROUP BY primary_type

En la siguiente imagen, se muestra un ejemplo del resultado de esta búsqueda:

Son los resultados de la consulta para agrupar los resultados por tipo principal.

En este ejemplo, definirás una tabla de ubicaciones. Luego, para cada ubicación, calcula la cantidad de restaurantes cercanos, es decir, los que se encuentran a menos de 1,000 metros:

WITH my_locations AS (
  SELECT 'Location 1' AS name, ST_GEOGPOINT(-74.00776440888504, 40.70932825380786) AS location
  UNION ALL
  SELECT 'Location 2' AS name, ST_GEOGPOINT(-73.98257192833559, 40.750738934863215) AS location
  UNION ALL
  SELECT 'Location 3' AS name, ST_GEOGPOINT(-73.94701794263223, 40.80792954838445)  AS location
)
SELECT WITH AGGREGATION_THRESHOLD
  l.name,
  COUNT(*) as count
FROM
  `places_insights___us___sample.places_sample` p
JOIN
   my_locations l
ON
  ST_DWITHIN(l.location, p.point, 1000)
WHERE
  primary_type = "restaurant"
  AND business_status = "OPERATIONAL"
GROUP BY
  l.name

En la siguiente imagen, se muestra un ejemplo del resultado de esta búsqueda:

Son los resultados de la consulta para agrupar los resultados por ubicación.