Aby uzyskać dostęp do danych Statystyk miejsc, piszesz zapytania SQL w BigQuery, które zwracają zagregowane statystyki dotyczące miejsc. Wyniki są zwracane z zestawu danych dla kryteriów wyszukiwania określonych w zapytaniu.
Wymagania dotyczące zapytań
Instrukcja SELECT
w zapytaniu musi zawierać WITH AGGREGATION_THRESHOLD
i określać zbiór danych. Na przykład:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample`
W tym przykładzie użyjesz FROM
, aby określić places_insights___us___sample.places_sample
zbiór danych dla Stanów Zjednoczonych.
Określanie ograniczenia lokalizacji
Zwróć uwagę, że poprzednie zapytanie nie określa żadnych ograniczeń lokalizacji, co oznacza, że agregacja danych jest stosowana do całego zbioru danych. Zazwyczaj określasz ograniczenie lokalizacji, jak pokazano poniżej:
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)
W tym przykładzie zapytanie określa ograniczenie kierowania na Pałac Kultury w Warszawie o promieniu 1000 metrów.
Obszar wyszukiwania możesz określić za pomocą wielokąta. W przypadku wielokąta punkty muszą tworzyć zamkniętą pętlę, w której pierwszy punkt jest taki sam jak ostatni:
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)
W następnym przykładzie obszar wyszukiwania jest definiowany za pomocą linii połączonych punktów. Linia jest podobna do trasy podróży obliczonej przez Routes API. Trasa może być przeznaczona dla pojazdu, roweru lub pieszego:
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)
W tym przykładzie promień wyszukiwania wokół linii został ustawiony na 100 metrów.
Filtrowanie według pól zbioru danych o miejscach
Zawęź wyszukiwanie na podstawie pól zdefiniowanych przez schemat zbioru danych. Filtruj wyniki na podstawie pól zbioru danych, takich jak miejsce regular_opening_hours
, price_level
i klient rating
.
Odwołuj się do dowolnych pól w zbiorze danych zdefiniowanych przez schemat zbioru danych dla kraju, który Cię interesuje. Schemat zbioru danych dla każdego kraju składa się z 2 części:
- Schemat podstawowy, który jest wspólny dla zbiorów danych ze wszystkich krajów.
- schemat specyficzny dla danego kraju, który określa komponenty schematu właściwe dla tego kraju;
Zapytanie może na przykład zawierać klauzulę WHERE
, która określa kryteria filtrowania zapytania. W tym przykładzie zwracasz dane agregacji dotyczące miejsc typu restaurant
z wartością business_status
równą OPERATIONAL
, które mają wartość rating
większą lub równą 4, 0, a wartość allows_dogs
jest ustawiona na 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
Kolejne zapytanie zwraca wyniki dotyczące miejsc, w których znajduje się co najmniej 8 stacji ładowania EV:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE ev_charge_options.connector_count > 8;
Filtrowanie według głównego typu miejsca i typu miejsca
Każde miejsce w zbiorze danych może mieć:
Jeden typ podstawowy powiązany z nim spośród typów zdefiniowanych w tabeli A. Na przykład typem głównym może być
mexican_restaurant
lubsteak_house
. Użyj znakuprimary_type
w zapytaniu, aby filtrować wyniki według głównego typu miejsca.Wiele wartości typu powiązanych z typami zdefiniowanymi w tabeli A. Na przykład restauracja może mieć te typy:
seafood_restaurant
,restaurant
,food
,point_of_interest
,establishment
. Użyj znakutypes
w zapytaniu, aby odfiltrować wyniki na liście typów powiązanych z miejscem.
To zapytanie zwraca wyniki dla wszystkich miejsc, których głównym typem jest bar
, ale które pełnią też funkcję restaurant
:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___us___sample.places_sample` WHERE 'restaurant' IN UNNEST(types) AND 'bar' = primary_type
Filtrowanie według zdefiniowanych wartości danych
Wiele pól zbioru danych ma wstępnie zdefiniowane wartości. Przykład:
Pole
price_level
obsługuje te predefiniowane wartości:PRICE_LEVEL_FREE
PRICE_LEVEL_INEXPENSIVE
PRICE_LEVEL_MODERATE
PRICE_LEVEL_EXPENSIVE
PRICE_LEVEL_VERY_EXPENSIVE
Pole
business_status
obsługuje te predefiniowane wartości:OPERATIONAL
CLOSED_TEMPORARILY
CLOSED_PERMANENTLY
W tym przykładzie zapytanie zwraca liczbę wszystkich restauracji o ocenie business_status
OPERATIONAL
w promieniu 1000 metrów od Empire State Building w Nowym Jorku:
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)
Filtrowanie według godzin otwarcia
W tym przykładzie zwracamy liczbę wszystkich miejsc w obszarze geograficznym, w których w piątki obowiązują happy hours:
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);
Używanie funkcji agregacji
Poniższy przykład pokazuje obsługiwane funkcje agregacji BigQuery. To zapytanie agreguje oceny wszystkich miejsc znajdujących się w promieniu 1000 metrów od Empire State Building w Nowym Jorku, aby uzyskać statystyki ocen:
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"
Zwracanie grup wyników
Wyświetlone do tej pory zapytania zwracają w wyniku jeden wiersz zawierający liczbę agregacji dla zapytania. Możesz też użyć operatora GROUP BY
, aby zwrócić w odpowiedzi wiele wierszy na podstawie kryteriów grupowania.
Na przykład to zapytanie zwraca wyniki pogrupowane według głównego typu każdego miejsca w obszarze wyszukiwania:
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
Na poniższym obrazie widać przykładowe dane wyjściowe tego zapytania:
W tym przykładzie zdefiniujesz tabelę lokalizacji. Następnie dla każdej lokalizacji oblicz liczbę pobliskich restauracji, czyli tych, które znajdują się w odległości do 1000 metrów:
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
Na poniższym obrazie widać przykładowe dane wyjściowe tego zapytania: