Places Insights verilerine doğrudan erişmek için BigQuery'de SQL sorguları yazarsınız. Bu sorgular, yerlerle ilgili toplu analizler döndürür. Sonuçlar, sorguda belirtilen arama ölçütleri için veri kümesinden döndürülür.
5'ten az sayı elde etmeniz gerekiyorsa bunun yerine yer sayısı işlevlerini kullanmayı düşünebilirsiniz. Bu işlevler 0 dahil olmak üzere herhangi bir sayı döndürebilir ancak minimum 40, 0 metreye 40, 0 metre (1.600 m2) arama alanı zorunlu kılar. Doğrudan sorgulama yapmanın ve işlev kullanmanın ne zaman uygun olduğu hakkında daha fazla bilgi edinin.
Sorgularla ilgili temel bilgiler
Aşağıdaki resimde bir sorgunun temel biçimi gösterilmektedir:
Sorgunun her bir bölümü aşağıda daha ayrıntılı olarak açıklanmıştır.
Sorgu şartları
Doğrudan veri kümesi üzerinde yapılan SQL sorgularında veri kümesi belirtilmeli ve WITH AGGREGATION_THRESHOLD ifadesi SELECT yan tümcesinde yer almalıdır. Bu olmadan sorgu başarısız olur.
Bu örnekte, ABD'deki veri kümesi için sorgu göndermek üzere places_insights___us.places belirtiliyor.
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places`
Proje adı belirtin (isteğe bağlı)
İsteğe bağlı olarak sorguya proje adınızı ekleyebilirsiniz. Proje adı belirtmezseniz sorgunuz varsayılan olarak etkin projeye yönlendirilir.
Farklı projelerde aynı ada sahip veri kümelerini bağladıysanız veya etkin proje dışındaki bir tabloya sorgu gönderiyorsanız proje adınızı eklemek isteyebilirsiniz.
Örneğin, [project name].[dataset name].places.
Toplama işlevi belirtme
Aşağıdaki örnekte, desteklenen BigQuery toplama işlevleri gösterilmektedir. Bu sorgu, New York City'deki Empire State Binası'nın 1.000 metre yarıçapındaki tüm yerlerin puanlarını toplayarak puan istatistikleri oluşturur:
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 `PROJECT_NAME.places_insights___us.places` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000) AND business_status = "OPERATIONAL"
Konum kısıtlaması belirtme
Konum kısıtlaması belirtmezseniz veri toplama işlemi tüm veri kümesine uygulanır. Genellikle belirli bir alanı aramak için konum kısıtlaması belirtirsiniz. Bu örnek sorgu, New York City'deki Empire State Binası'nı merkez alan ve 1.000 metre yarıçaplı bir hedef kısıtlama belirtir.
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
Arama alanını belirtmek için poligon kullanabilirsiniz. Çokgen kullanırken çokgenin noktaları, çokgendeki ilk noktanın son noktayla aynı olduğu kapalı bir döngü tanımlamalıdır:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` 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)
Bir sonraki örnekte, arama alanını bağlı noktalardan oluşan bir çizgiyle tanımlıyor ve arama yarıçapını çizginin etrafında 100 metre olarak ayarlıyorsunuz. Çizgi, Routes API tarafından hesaplanan bir seyahat rotasına benzer. Rota; araç, bisiklet veya yaya için olabilir:
DECLARE route GEOGRAPHY; SET route = ST_GEOGFROMTEXT("""LINESTRING(-73.98903537033028 40.73655649223003, -73.93580216278471 40.80955538843361)"""); SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ST_DWITHIN(route, point, 100)
Yer veri kümesi alanlarına göre filtreleme
Aramanızı veri kümesi şeması tarafından tanımlanan alanlara göre hassaslaştırın. Sonuçları yer regular_opening_hours, price_level ve müşteri rating gibi veri kümesi alanlarına göre filtreleyin.
İlgilendiğiniz ülke için veri kümesi şemasıyla tanımlanan veri kümesindeki tüm alanlara referans verin. Her ülkenin veri kümesi şeması iki bölümden oluşur:
- Tüm ülkelerdeki veri kümeleri için ortak olan çekirdek şema.
- İlgili ülkeye özgü şema bileşenlerini tanımlayan bir ülkeye özgü şema.
Örneğin, sorgunuzda sorgu için filtreleme ölçütlerini tanımlayan bir WHERE koşulu olabilir.
Aşağıdaki örnekte, tourist_attraction türündeki yerler için toplama verileri döndürüyorsunuz. Bu yerlerin business_status değeri OPERATIONAL, rating değeri 4, 0'a eşit veya daha büyük ve allows_dogs değeri true olarak ayarlanmış.
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000) AND 'tourist_attraction' IN UNNEST(types) AND business_status = "OPERATIONAL" AND rating >= 4.0 AND allows_dogs = true
Aşağıdaki sorgu, en az sekiz elektrikli araç şarj istasyonu olan yerlerle ilgili sonuçlar döndürür:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ev_charge_options.connector_count > 8;
Yerin birincil türüne ve yer türüne göre filtreleme
Veri kümesindeki her yer şunlara sahip olabilir:
Yer türleri tarafından tanımlanan türler arasından bununla ilişkili tek bir birincil tür. Örneğin, birincil tür
mexican_restaurantveyasteak_houseolabilir. Bir sorgudaprimary_typekullanarak sonuçları bir yerin birincil türüne göre filtreleyin.Yer türleri tarafından tanımlanan türlerden birden fazla tür değeri ile ilişkilendirilmiş olmalıdır. Örneğin, bir restoranın şu türleri olabilir:
seafood_restaurant,restaurant,food,point_of_interest,establishment. Bir sorgudatypeskullanarak yerle ilişkili türler listesindeki sonuçları filtreleyin.
Aşağıdaki sorgu, birincil türü skin_care_clinic olan ve aynı zamanda spa olarak işlev gören tüm yerlerle ilgili sonuçlar döndürür:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE 'spa' IN UNNEST(types) AND 'skin_care_clinic' = primary_type
Yer kimliğine göre filtreleme
Aşağıdaki örnekte 5 yerin ortalama puanı hesaplanmaktadır. Yerlerin place_id ile tanımlandığını belirtin.
DECLARE place_ids ARRAY<STRING>; SET place_ids = ['ChIJPQOh8YVZwokRE2WsbZI4tOk', 'ChIJibtT3ohZwokR7tX0gp0nG8U', 'ChIJdfD8moVZwokRO6vxjXAtoWs', 'ChIJsdNONuFbwokRLM-yuifjb8k', 'ChIJp0gKoClawokR0txqrcaEkFc']; SELECT WITH AGGREGATION_THRESHOLD AVG(rating) as avg_rating, FROM `PROJECT_NAME.places_insights___us.places`, UNNEST(place_ids) place_id WHERE id = place_id;
Belirli yer kimliklerini filtreleme
Ayrıca, bir sorgudan bir dizi yer kimliğini hariç tutabilirsiniz.
Aradığınız yer kimliklerini Yer Kimliği Bulucu'yu kullanarak veya Places API'yi kullanarak programatik olarak Metin Arama (Yeni) isteği göndererek bulabilirsiniz.
Aşağıdaki örnekte, sorgu Avustralya'nın Sidney şehrindeki 2000 posta kodunda bulunan ve excluded_cafes dizisinde görünmeyen kafelerin sayısını bulur. Bu tür bir sorgu, kendi işletmelerini bir sayımdan hariç tutmak isteyen bir işletme sahibi için yararlı olabilir.
WITH excluded_cafes AS ( -- List the specific place IDs to exclude from the final count SELECT * FROM UNNEST([ 'ChIJLTcYGz-uEmsRmazk9oMnP5w', 'ChIJeWDDDNOvEmsRF8SMPUwPbhw', 'ChIJKdaKHbmvEmsRSdxq_1O05bU' ]) AS place_id ) SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `places_insights___au.places` AS places -- Perform a LEFT JOIN to identify which places are in the exclusion list LEFT JOIN excluded_cafes ON places.id = excluded_cafes.place_id WHERE -- Filter for specific place type and postal code places.primary_type = 'cafe' AND '2000' IN UNNEST(places.postal_code_names) -- Keep only the rows where the join failed (meaning the ID was NOT in the list) AND excluded_cafes.place_id IS NULL;
Önceden tanımlanmış veri değerlerine göre filtreleme
Birçok veri kümesi alanında önceden tanımlanmış değerler bulunur. Örneğin:
price_levelalanı aşağıdaki önceden tanımlanmış değerleri destekler:PRICE_LEVEL_FREEPRICE_LEVEL_INEXPENSIVEPRICE_LEVEL_MODERATEPRICE_LEVEL_EXPENSIVEPRICE_LEVEL_VERY_EXPENSIVE
business_statusalanı aşağıdaki önceden tanımlanmış değerleri destekler:OPERATIONALCLOSED_TEMPORARILYCLOSED_PERMANENTLY
Bu örnekte sorgu, New York City'deki Empire State Binası'nın 1.000 metre yarıçapındaki business_status OPERATIONAL olan tüm çiçekçilerin sayısını döndürüyor:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000) AND business_status = "OPERATIONAL" AND 'florist' IN UNNEST(types)
Çalışma saatlerine göre filtreleme
Bu örnekte, bir coğrafi bölgedeki cuma günleri happy hour'ı olan tüm yerlerin sayısını döndürün:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places`, 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);
Bölgeye göre filtreleme (adres bileşenleri)
Yerler veri setimizde, sonuçları siyasi sınırlara göre filtrelemek için yararlı olan bir dizi adres bileşeni de bulunur. Her adres bileşeni, metin kodu adıyla (NYC'deki posta kodu için 10002) veya eşdeğer posta kodu kimliği için yer kimliğiyle (ChIJm5NfgIBZwokR6jLqucW0ipg) tanımlanır.
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE '10002' IN UNNEST(postal_code_names) --- 'ChIJm5NfgIBZwokR6jLqucW0ipg' IN UNNEST(postal_code_ids) -- same filter as above using postal code ID
EV şarjına göre filtreleme
Bu örnekte, en az 8 elektrikli araç şarj cihazı olan yerlerin sayısı verilmektedir:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ev_charge_options.connector_count > 8;
Bu örnekte, hızlı şarjı destekleyen en az 10 Tesla şarj cihazının bulunduğu yerlerin sayısı hesaplanmaktadır:
SELECT WITH AGGREGATION_THRESHOLD COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places`, UNNEST(ev_charge_options.connector_aggregation) as connectors WHERE connectors.type ='EV_CONNECTOR_TYPE_TESLA' AND connectors.max_charge_rate_kw >= 50 AND connectors.count >= 10
Sonuç gruplarını döndürme
Şu ana kadar gösterilen sorgular, sonuçta sorgunun toplama sayısını içeren tek bir satır döndürür. Gruplandırma ölçütlerine göre yanıtta birden fazla satır döndürmek için GROUP BY operatörünü de kullanabilirsiniz.
Örneğin, aşağıdaki sorgu, arama alanındaki her yerin birincil türüne göre gruplandırılmış sonuçlar döndürür:
SELECT WITH AGGREGATION_THRESHOLD primary_type, COUNT(*) AS count FROM `PROJECT_NAME.places_insights___us.places` WHERE ST_DWITHIN(ST_GEOGPOINT(-73.99992071622756, 40.71818785986936), point, 1000) GROUP BY primary_type
Bu resimde, şu sorgunun örnek çıkışı gösterilmektedir:

Bu örnekte, konumların bulunduğu bir tablo tanımlıyorsunuz. Ardından, her konum için yakındaki restoranların sayısını (1.000 metre içindeki restoranlar) hesaplarsınız:
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 `PROJECT_NAME.places_insights___us.places` JOIN my_locations l ON ST_DWITHIN(l.location, p.point, 1000) WHERE primary_type = "restaurant" AND business_status = "OPERATIONAL" GROUP BY l.name
Bu resimde, şu sorgunun örnek çıkışı gösterilmektedir:
