上級: データセットに直接クエリを実行する

Places Insights データに直接アクセスするには、BigQuery で SQL クエリを記述して、場所に関する集約された分析情報を取得します。クエリで指定された検索条件のデータセットから結果が返されます。

集計しきい値について

未加工のテーブルに対して直接実行される標準 SQL クエリでは、厳格な集計しきい値が適用されます。出力行は、計算された集計数が 5 以上の場合にのみ生成されます。

クエリフィルタの結果が 0、1、2、3、4 のいずれかの場合、結果行全体がレスポンスから除外されます。アプリケーション ロジックで、正確な低いカウント(0 を含む)が必要な場合や、個々のプレイス ID を取得する必要がある場合は、代わりに Places Count Functions を使用してデータセットをクエリする必要があります。

クエリの基本

次の図は、クエリの基本形式を示しています。

クエリの基本形式。

クエリの各部分について、以下で詳しく説明します。

クエリの要件

データセットに対して直接実行される SQL クエリでは、データセットを指定し、SELECT 句に WITH AGGREGATION_THRESHOLD を含める必要があります。これがないと、クエリは失敗します。

この例では、places_insights___us.places を指定して米国のデータセットをクエリします。

SELECT WITH AGGREGATION_THRESHOLD
COUNT(*) AS count
FROM `PROJECT_NAME.places_insights___us.places`

プロジェクト名を指定する(省略可)

必要に応じて、クエリにプロジェクト名を含めることができます。プロジェクト名を指定しない場合、クエリはデフォルトでアクティブなプロジェクトになります。

異なるプロジェクトに同じ名前のリンクされたデータセットがある場合や、アクティブなプロジェクト外のテーブルをクエリする場合は、プロジェクト名を含めることをおすすめします。

例: [project name].[dataset name].places

集計関数を指定する

次の例は、サポートされている BigQuery の集計関数を示しています。このクエリは、ニューヨーク市のエンパイア ステート ビルから半径 1,000 メートル以内にあるすべての場所の評価を集計して、評価の統計情報を生成します。

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"

地理的なポリゴンとラインを使用して結果をフィルタする

ロケーション制限を指定しない場合、データ集計はデータセット全体に適用されます。通常は、特定のエリアを検索するために位置情報の制限を指定します。

1. 放射状検索バッファ(ST_DWITHIN)を使用してフィルタする

次のクエリの例では、ニューヨーク市のエンパイア ステート ビルディングを中心とする半径 1, 000 メートルの範囲をターゲット制限として指定しています。

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)

2. ポリゴン境界(ST_CONTAINS)を使用してフィルタする

ポリゴンを使用して検索エリアを指定できます。ポリゴンを使用する場合、ポリゴンのポイントは、ポリゴンの最初のポイントが最後のポイントと同じになる閉ループを定義する必要があります。

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)

3. ルート移動バッファ(LINESTRING)に沿ってフィルタする

次の例では、接続されたポイントのラインを使用して検索エリアを定義し、ラインの周囲 100 メートルを検索半径に設定します。この線は、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 `PROJECT_NAME.places_insights___us.places`
WHERE
  ST_DWITHIN(route, point, 100)

プレイス データセットのフィールドでフィルタする

データセット スキーマで定義されたフィールドに基づいて検索を絞り込みます。場所 regular_opening_hours、price_level、顧客 rating などのデータセット フィールドに基づいて結果をフィルタします。

対象の国のデータセット スキーマで定義されているデータセット内のフィールドを参照します。各国のデータセット スキーマは、次の 2 つの部分で構成されています。

たとえば、クエリに WHERE 句を含めて、クエリのフィルタ条件を定義できます。

次の例では、business_status が OPERATIONAL で、rating が 4.0 以上、allows_dogs が true に設定されている、tourist_attraction タイプの場所の集計データを返します。

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

次のクエリは、EV 充電スタンドが 8 つ以上ある場所の結果を返します。

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  ev_charge_options.connector_count > 8;

場所のメインタイプと場所のタイプでフィルタする

データセット内の各場所には、次の情報を含めることができます。

  • プレイスタイプで定義されたタイプから、それに関連付けられた単一のプライマリ タイプ。たとえば、プライマリ タイプは mexican_restaurant または steak_house です。クエリで primary_type を使用して、場所のメインタイプで結果をフィルタします。
  • 場所タイプで定義されたタイプから、それに関連付けられた複数のタイプ値。たとえば、レストランには seafood_restaurant、restaurant、food、point_of_interest、establishment などのタイプがあります。クエリで types を使用して、場所に関連付けられたタイプのリストで結果をフィルタします。

次のクエリは、プライマリ タイプが skin_care_clinic で、spa としても機能するすべての場所の結果を返します。

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

プレイス ID でフィルタ

次の例では、5 つの場所の平均評価を計算します。場所は place_id で識別されます。

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;

クエリ結果から特定のプレイス ID を除外する

クエリからプレイス ID の配列を除外することもできます。

目的のプレイス ID を見つけるには、プレイス ID ファインダーを使用するか、Places API を使用してテキスト検索(新版)リクエストを実行します。

次の例では、クエリは、オーストラリアのシドニーの郵便番号 2000 にあるカフェのうち、excluded_cafes 配列に含まれていないカフェの数を検索します。このようなクエリは、自分のビジネスをカウントから除外したいビジネス オーナーに役立ちます。

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;

事前定義されたデータ値でフィルタする

多くのデータセット フィールドには、事前定義された値があります。次に例を示します。

  • 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
    • FUTURE_OPENING

この例では、ニューヨーク市のエンパイア ステート ビルディングから半径 1, 000 メートル以内にある、business_status が OPERATIONAL のすべての花屋の数を返します。

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)

営業時間でフィルタ

この例では、金曜日のハッピーアワーがある地域のすべての場所の数を返します。

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

地域(住所コンポーネント)でフィルタする

Google の場所データセットには、行政上の境界に基づいて結果をフィルタリングするのに役立つ一連の住所コンポーネントも含まれています。各住所コンポーネントは、テキストコード名(ニューヨーク市の郵便番号の場合は 10002)または同等の郵便番号 ID のプレイス ID(ChIJm5NfgIBZwokR6jLqucW0ipg)で識別されます。

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 充電構成でフィルタする

この例では、EV 充電器が 8 台以上ある場所の数をカウントします。

SELECT WITH AGGREGATION_THRESHOLD
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places`
WHERE
  ev_charge_options.connector_count > 8;

この例では、急速充電に対応する Tesla 充電器が 10 台以上ある場所の数をカウントします。

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

データ スナップショットの日付でフィルタする

場所のデータセットには、2024 年 1 月以降の各月の場所の数に関するデータが含まれています。特定の月の場所データのスナップショットをクエリするには、snapshot_date フィールドを使用してフィルタします。

たとえば、次のクエリは、2024 年 1 月に検索エリア内の各場所のプライマリ タイプ別にグループ化された結果を返します。

SELECT WITH AGGREGATION_THRESHOLD
  primary_type,
  COUNT(*) AS count
FROM
  `PROJECT_NAME.places_insights___us.places_historical`
WHERE
  snapshot_date = '2024-01-01'
  AND ST_DWITHIN(ST_GEOGPOINT(-73.9857, 40.7484), point, 1000)
GROUP BY
  primary_type;

グループ化された結果行を返す

これまでに示したクエリでは、クエリの集計カウントを含む 1 行の結果が返されます。GROUP BY 演算子を使用して、グループ化条件に基づいてレスポンスで複数の行を返すこともできます。

たとえば、次のクエリは、検索エリア内の各場所のプライマリ タイプでグループ化された結果を返します。

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

次の画像は、このクエリの出力例を示しています。

プライマリ タイプ別に結果をグループ化するクエリ結果。

この例では、ロケーションのテーブルを定義します。次に、各場所について、近くのレストラン(1, 000 メートル以内にあるレストラン)の数を計算します。

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` AS 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

次の画像は、このクエリの出力例を示しています。

結果を地域別にグループ化するクエリ結果。