Напишите запрос Places Insights

Для доступа к данным Places Insights вы пишете SQL-запросы в BigQuery, которые возвращают агрегированные данные о местах. Результаты возвращаются из набора данных, соответствующего критериям поиска, указанным в запросе.

Требования к запросу

Оператор SELECT в запросе должен включать WITH AGGREGATION_THRESHOLD и указывать набор данных. Например:

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

В этом примере вы используете FROM для указания набора данных places_insights___us___sample.places_sample для Соединенных Штатов.

Укажите ограничение по местоположению

Обратите внимание, что в предыдущем запросе не указано никаких ограничений по местоположению, что означает, что агрегация данных применяется ко всему набору данных. Обычно ограничение по местоположению указывается, как показано ниже:

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)

В этом примере ваш запрос задает целевое ограничение, сосредоточенное вокруг здания Эмпайр-стейт-билдинг в Нью-Йорке с радиусом 1000 метров.

Для задания области поиска можно использовать многоугольник. При использовании многоугольника его точки должны образовывать замкнутый контур, в котором первая точка совпадает с последней:

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)

В следующем примере область поиска определяется линией, состоящей из соединённых точек. Эта линия аналогична маршруту, рассчитанному с помощью Routes API . Маршрут может быть автомобильным, велосипедным или пешеходным:

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)

В этом примере вы устанавливаете радиус поиска 100 метров вокруг линии.

Фильтр по полям набора данных места

Уточните поиск на основе полей, определенных схемой набора данных . Фильтруйте результаты по таким полям набора данных, как время regular_opening_hours , price_level и rating клиента.

Укажите все поля в наборе данных, определённые схемой набора данных для интересующей вас страны. Схема набора данных для каждой страны состоит из двух частей:

Например, ваш запрос может включать предложение WHERE , определяющее критерии фильтрации. В следующем примере возвращаются агрегированные данные для заведений типа restaurant со business_status , равным OPERATIONAL , rating не ниже 4,0 и параметром allows_dogs , имеющим значение 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

Следующий запрос возвращает результаты для мест, где есть не менее восьми станций зарядки электромобилей:

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

Фильтр по основному типу места и типу места

Каждое место в наборе данных может иметь:

  • Один основной тип , связанный с ним, из типов, определённых в таблице A. Например, основным типом может быть mexican_restaurant или steak_house . Используйте primary_type в запросе, чтобы отфильтровать результаты по основному типу места.

  • С ним связано несколько значений типов, определённых в таблице A. Например, ресторан может иметь следующие типы: seafood_restaurant , restaurant , food , point_of_interest , establishment . Используйте types в запросе для фильтрации результатов по списку типов, связанных с этим местом.

Следующий запрос возвращает результаты для всех мест, которые в основном являются bar , но также выполняют функции restaurant :

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

Фильтр по предопределенным значениям данных

Многие поля набора данных имеют предопределенные значения. Например:

  • Поле price_level поддерживает следующие предопределенные значения:

    • PRICE_LEVEL_FREE
    • PRICE_LEVEL_INEXPENSIVE
    • PRICE_LEVEL_MODERATE
    • PRICE_LEVEL_EXPENSIVE
    • PRICE_LEVEL_VERY_EXPENSIVE
  • Поле business_status поддерживает следующие предопределенные значения:

    • OPERATIONAL
    • CLOSED_TEMPORARILY
    • CLOSED_PERMANENTLY

В этом примере запрос возвращает количество всех ресторанов со business_status OPERATIONAL в радиусе 1000 метров от Эмпайр-стейт-билдинг в Нью-Йорке:

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)

Фильтр по часам работы

В этом примере вернем количество всех мест в географическом районе со счастливыми часами по пятницам:

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);

Используйте функцию агрегации

В примере ниже показаны поддерживаемые функции агрегации BigQuery. Этот запрос агрегирует рейтинги всех мест в радиусе 1000 метров от Эмпайр-стейт-билдинг в Нью-Йорке для получения статистики рейтингов:

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"

Группы результатов возврата

Приведённые выше запросы возвращают одну строку в результатах, содержащую количество агрегаций для запроса. Вы также можете использовать оператор GROUP BY для возврата нескольких строк в ответе на основе критериев группировки.

Например, следующий запрос возвращает результаты, сгруппированные по основному типу каждого места в области поиска:

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

На следующем изображении показан пример вывода этого запроса:

Результаты запроса для группировки результатов по основному типу.

В этом примере вы создаёте таблицу локаций. Для каждой локации вы вычисляете количество близлежащих ресторанов (то есть тех, что находятся в радиусе 1000 метров):

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

На следующем изображении показан пример вывода этого запроса:

Результаты запроса для группировки результатов по местоположению.