ขั้นสูง: ค้นหาชุดข้อมูลโดยตรง

หากต้องการเข้าถึงข้อมูลเชิงลึกเกี่ยวกับสถานที่โดยตรง คุณต้องเขียนการค้นหา SQL ใน BigQuery ที่แสดงข้อมูลเชิงลึกแบบรวมเกี่ยวกับสถานที่ ระบบจะแสดงผลลัพธ์จากชุดข้อมูลสำหรับเกณฑ์การค้นหาที่ระบุในการค้นหา

ทำความเข้าใจเกณฑ์ขั้นต่ำของการรวมข้อมูล

การค้นหา SQL มาตรฐานที่เรียกใช้โดยตรงในตารางข้อมูลดิบจะบังคับใช้เกณฑ์ขั้นต่ำของการรวมข้อมูลที่เข้มงวด ระบบจะสร้างแถวเอาต์พุตก็ต่อเมื่อจำนวนการรวมที่คำนวณได้มีค่าตั้งแต่ 5 ขึ้นไป

หากตัวกรองการค้นหาแสดงจำนวนเป็น 0, 1, 2, 3 หรือ 4 ระบบจะละเว้นแถวผลลัพธ์ทั้งหมดจากการตอบกลับ หากตรรกะของแอปพลิเคชันต้องการจำนวนที่ต่ำและแม่นยำ (รวมถึง 0) หรือต้องการดึงข้อมูลรหัสสถานที่แต่ละรายการ คุณต้องค้นหาชุดข้อมูลโดยใช้ฟังก์ชันการนับสถานที่แทน

ข้อมูลเบื้องต้นเกี่ยวกับการค้นหา

รูปภาพต่อไปนี้แสดงรูปแบบพื้นฐานของการค้นหา

รูปแบบพื้นฐานของการค้นหา

เราจะอธิบายแต่ละส่วนของคำค้นหาโดยละเอียดที่ด้านล่าง

ข้อกำหนดในการค้นหา

การค้นหา SQL ที่ทำในชุดข้อมูลโดยตรงต้องระบุชุดข้อมูลและรวม WITH AGGREGATION_THRESHOLD ไว้ในส่วนคำสั่ง SELECT หากไม่มีข้อมูลนี้ การค้นหาจะล้มเหลว

ตัวอย่างนี้ระบุ 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 ที่กำหนดเกณฑ์การกรองสำหรับการค้นหา

ในตัวอย่างต่อไปนี้ คุณจะแสดงผลข้อมูลรวมสำหรับสถานที่ประเภท tourist_attraction ที่มี business_status เป็น OPERATIONAL ซึ่งมี rating มากกว่าหรือเท่ากับ 4.0 และตั้งค่า allows_dogs เป็น true

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

กรองตามรหัสสถานที่

ตัวอย่างด้านล่างจะคำนวณคะแนนเฉลี่ยของสถานที่ 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;

ยกเว้นรหัสสถานที่ที่เฉพาะเจาะจงจากผลการค้นหา

นอกจากนี้ คุณยังยกเว้นอาร์เรย์ของรหัสสถานที่จากการค้นหาได้ด้วย

คุณสามารถค้นหารหัสสถานที่ที่ต้องการได้โดยใช้เครื่องมือค้นหารหัสสถานที่ หรือใช้ 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

ในตัวอย่างนี้ การค้นหาจะแสดงจำนวนร้านดอกไม้ทั้งหมดที่มี business_status เป็น OPERATIONAL ภายในรัศมี 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)
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);

กรองตามภูมิภาค (องค์ประกอบที่อยู่)

ชุดข้อมูลสถานที่ของเรายังมีชุดคอมโพเนนต์ที่อยู่ซึ่งมีประโยชน์สำหรับการกรองผลลัพธ์ตามขอบเขตทางการเมืองด้วย องค์ประกอบที่อยู่แต่ละรายการจะระบุด้วยชื่อรหัสข้อความ (10002 สำหรับรหัสไปรษณีย์ใน NYC) หรือรหัสสถานที่ (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 หากต้องการค้นหาภาพรวมของข้อมูลสถานที่สำหรับเดือนที่ระบุ ให้กรองโดยใช้ช่อง snapshot_date

ตัวอย่างเช่น การค้นหาต่อไปนี้จะแสดงผลลัพธ์ที่จัดกลุ่มตามประเภทหลักสำหรับสถานที่แต่ละแห่งในพื้นที่ค้นหาในเดือนมกราคม 2024

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;

แสดงแถวผลลัพธ์ที่จัดกลุ่ม

คำค้นหาที่แสดงจนถึงตอนนี้จะแสดงผลแถวเดียวในผลลัพธ์ที่มีจำนวนการรวมสำหรับคำค้นหา นอกจากนี้ คุณยังใช้โอเปอเรเตอร์ 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

รูปภาพนี้แสดงตัวอย่างเอาต์พุตของคำค้นหานี้

ผลการค้นหาสำหรับการจัดกลุ่มผลลัพธ์ตามสถานที่ตั้ง