Standard SQL ใน Google BigQuery: ข้อดีและตัวอย่างการใช้งานในการตลาด
เผยแพร่แล้ว: 2022-04-12ในปี 2016 Google BigQuery ได้แนะนำวิธีใหม่ในการสื่อสารกับตาราง: Standard SQL ก่อนหน้านั้น BigQuery มีภาษาคิวรีที่มีโครงสร้างเป็นของตัวเองซึ่งเรียกว่า BigQuery SQL (ปัจจุบันเรียกว่า Legacy SQL)
เมื่อมองแวบแรก ไม่มีความแตกต่างระหว่าง Legacy และ Standard SQL มากนัก: ชื่อของตารางนั้นเขียนต่างกันเล็กน้อย Standard มีข้อกำหนดด้านไวยากรณ์ที่เข้มงวดกว่าเล็กน้อย (เช่น คุณไม่สามารถใส่เครื่องหมายจุลภาคก่อน FROM) และประเภทข้อมูลอื่นๆ แต่ถ้าคุณมองอย่างใกล้ชิด จะมีการเปลี่ยนแปลงรูปแบบเล็กน้อยที่ทำให้นักการตลาดได้เปรียบหลายประการ
ในบทความนี้ คุณจะได้คำตอบสำหรับคำถามต่อไปนี้:
- ข้อดีของ Standard SQL เหนือ Legacy SQL คืออะไร?
- ความสามารถของ Standard SQL คืออะไรและใช้งานอย่างไร?
- ฉันจะย้ายจาก Legacy เป็น Standard SQL ได้อย่างไร
- Standard SQL รองรับบริการ ฟีเจอร์ไวยากรณ์ ตัวดำเนินการ และฟังก์ชันอื่นๆ ใดบ้าง
- ฉันจะใช้การสืบค้น SQL สำหรับรายงานการตลาดได้อย่างไร
ข้อดีของ Standard SQL เหนือ Legacy SQL คืออะไร?
ชนิดข้อมูลใหม่: อาร์เรย์และฟิลด์ที่ซ้อนกัน
Standard SQL รองรับชนิดข้อมูลใหม่: ARRAY และ STRUCT (อาร์เรย์และฟิลด์ที่ซ้อนกัน) ซึ่งหมายความว่าใน BigQuery การทำงานกับตารางที่โหลดจากไฟล์ JSON/Avro ทำได้ง่ายกว่า ซึ่งมักจะมีไฟล์แนบหลายระดับ
ฟิลด์ที่ซ้อนกันคือตารางขนาดเล็กภายในตารางที่ใหญ่กว่า:

ในแผนภาพด้านบน แถบสีน้ำเงินและสีเหลืองคือเส้นที่ฝังตารางขนาดเล็ก แต่ละบรรทัดคือหนึ่งเซสชัน เซสชันมีพารามิเตอร์ร่วมกัน: วันที่ หมายเลข ID หมวดหมู่อุปกรณ์ผู้ใช้ เบราว์เซอร์ ระบบปฏิบัติการ ฯลฯ นอกจากพารามิเตอร์ทั่วไปสำหรับแต่ละเซสชันแล้ว ตาราง Hit ยังแนบมากับบรรทัดอีกด้วย

ตาราง Hit ประกอบด้วยข้อมูลเกี่ยวกับการกระทำของผู้ใช้บนไซต์ ตัวอย่างเช่น หากผู้ใช้คลิกที่แบนเนอร์ พลิกดูแคตตาล็อก เปิดหน้าสินค้า ใส่สินค้าในตะกร้า หรือสั่งซื้อ การดำเนินการเหล่านี้จะถูกบันทึกไว้ในตาราง Hit
หากผู้ใช้วางคำสั่งซื้อบนไซต์ ข้อมูลเกี่ยวกับคำสั่งซื้อจะถูกป้อนในตาราง Hit ด้วย:
- รหัสธุรกรรม (หมายเลขที่ระบุธุรกรรม)
- ธุรกรรมรายได้ (มูลค่ารวมของการสั่งซื้อ)
- ธุรกรรมการจัดส่งสินค้า (ค่าขนส่ง)
ตารางข้อมูลเซสชันที่รวบรวมโดยใช้ OWOX BI มีโครงสร้างที่คล้ายกัน
สมมติว่าคุณต้องการทราบจำนวนคำสั่งซื้อจากผู้ใช้ในนิวยอร์กซิตี้ในเดือนที่ผ่านมา หากต้องการทราบ คุณต้องอ้างอิงตาราง Hit และนับจำนวนรหัสธุรกรรมที่ไม่ซ้ำ ในการดึงข้อมูลจากตารางดังกล่าว Standard SQL มีฟังก์ชัน UNNEST:
#standardSQL SELECT COUNT (DISTINCT hits.transaction.transactionId) -- count the number of unique order numbers; DISTINCT helps to avoid duplication FROM `project_name.dataset_name.owoxbi_sessions_*` -- refer to the table group (wildcard tables) WHERE ( _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTHS)) -- if we don't know which dates we need, it's better to use the function FORMAT_DATE INTERVAL AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ) AND geoNetwork.city = 'New York' -- choose orders made in New York City
#standardSQL SELECT COUNT (DISTINCT hits.transaction.transactionId) -- count the number of unique order numbers; DISTINCT helps to avoid duplication FROM `project_name.dataset_name.owoxbi_sessions_*` -- refer to the table group (wildcard tables) WHERE ( _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTHS)) -- if we don't know which dates we need, it's better to use the function FORMAT_DATE INTERVAL AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ) AND geoNetwork.city = 'New York' -- choose orders made in New York City
หากข้อมูลคำสั่งซื้อถูกบันทึกในตารางแยกต่างหากและไม่ใช่ในตารางที่ซ้อนกัน คุณจะต้องใช้ JOIN เพื่อรวมตารางกับข้อมูลคำสั่งซื้อและตารางที่มีข้อมูลเซสชัน เพื่อค้นหาว่าคำสั่งซื้อของเซสชันใดบ้าง
ตัวเลือกการค้นหาย่อยเพิ่มเติม
หากคุณต้องการดึงข้อมูลจากฟิลด์ที่ซ้อนกันหลายระดับ คุณสามารถเพิ่มแบบสอบถามย่อยด้วย SELECT และ WHERE ตัวอย่างเช่น ในตารางการสตรีมเซสชัน OWOX BI ผลิตภัณฑ์ ตารางย่อยอื่นจะถูกเขียนไปยังตารางย่อยของ Hit ตารางย่อยของผลิตภัณฑ์รวบรวมข้อมูลผลิตภัณฑ์ที่ส่งด้วยอาร์เรย์อีคอมเมิร์ซที่เพิ่มประสิทธิภาพ หากมีการตั้งค่าอีคอมเมิร์ซที่เพิ่มประสิทธิภาพบนไซต์และผู้ใช้ได้ดูหน้าผลิตภัณฑ์ คุณลักษณะของผลิตภัณฑ์นี้จะถูกบันทึกไว้ในตารางย่อยของผลิตภัณฑ์
เพื่อให้ได้คุณลักษณะของผลิตภัณฑ์เหล่านี้ คุณจะต้องมีแบบสอบถามย่อยภายในแบบสอบถามหลัก สำหรับคุณลักษณะของผลิตภัณฑ์แต่ละรายการ แบบสอบถามย่อย SELECT แยกกันจะถูกสร้างขึ้นในวงเล็บ:
SELECT column_name1, -- list the other columns you want to receive column_name2, (SELECT productBrand FROM UNNEST(hits.product)) AS hits_product_productBrand, (SELECT productRevenue FROM UNNEST(hits.product)) AS hits_product_productRevenue, -- list product features (SELECT localProductRevenue FROM UNNEST(hits.product)) AS hits_product_localProductRevenue, (SELECT productPrice FROM UNNEST(hits.product)) AS hits_product_productPrice, FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD`
SELECT column_name1, -- list the other columns you want to receive column_name2, (SELECT productBrand FROM UNNEST(hits.product)) AS hits_product_productBrand, (SELECT productRevenue FROM UNNEST(hits.product)) AS hits_product_productRevenue, -- list product features (SELECT localProductRevenue FROM UNNEST(hits.product)) AS hits_product_localProductRevenue, (SELECT productPrice FROM UNNEST(hits.product)) AS hits_product_productPrice, FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD`
ด้วยความสามารถของ Standard SQL ทำให้สร้างตรรกะการสืบค้นและเขียนโค้ดได้ง่ายขึ้น สำหรับการเปรียบเทียบ ใน Legacy SQL คุณจะต้องเขียนแลดเดอร์ประเภทนี้:
SELECT column_name1, column_name2, column_name3 FROM ( SELECT table_name.some_column AS column1… FROM table_name )
SELECT column_name1, column_name2, column_name3 FROM ( SELECT table_name.some_column AS column1… FROM table_name )
คำขอไปยังแหล่งภายนอก
เมื่อใช้ Standard SQL คุณจะเข้าถึงตาราง BigQuery ได้โดยตรงจาก Google Bigtable, Google Cloud Storage, Google ไดรฟ์ และ Google ชีต
กล่าวคือ แทนที่จะโหลดทั้งตารางลงใน BigQuery คุณสามารถลบข้อมูลด้วยการสืบค้นเพียงครั้งเดียว เลือกพารามิเตอร์ที่คุณต้องการ และอัปโหลดไปยังพื้นที่เก็บข้อมูลระบบคลาวด์
ฟังก์ชั่นผู้ใช้เพิ่มเติม (UDF)
หากคุณต้องการใช้สูตรที่ไม่ได้ระบุไว้ในเอกสาร User Defined Functions (UDF) จะช่วยคุณได้ ในทางปฏิบัติของเรา สิ่งนี้เกิดขึ้นไม่บ่อยนัก เนื่องจากเอกสาร Standard SQL ครอบคลุมงานเกือบทั้งหมดของการวิเคราะห์ดิจิทัล
ใน Standard SQL ฟังก์ชันที่ผู้ใช้กำหนดเองสามารถเขียนเป็น SQL หรือ JavaScript; SQL รุ่นเก่ารองรับเฉพาะ JavaScript อาร์กิวเมนต์ของฟังก์ชันเหล่านี้คือคอลัมน์ และค่าที่ใช้เป็นผลมาจากการจัดการคอลัมน์ ใน Standard SQL สามารถเขียนฟังก์ชันในหน้าต่างเดียวกับแบบสอบถามได้
เงื่อนไข JOIN เพิ่มเติม
ใน Legacy SQL เงื่อนไข JOIN ขึ้นอยู่กับชื่อความเท่าเทียมกันหรือชื่อคอลัมน์ นอกเหนือจากตัวเลือกเหล่านี้ ภาษา Standard SQL ยังสนับสนุน JOIN โดยความไม่เท่าเทียมกันและโดยการแสดงออกโดยพลการ
ตัวอย่างเช่น ในการระบุพันธมิตร CPA ที่ไม่เป็นธรรม เราสามารถเลือกเซสชันที่มีการเปลี่ยนแหล่งที่มาภายใน 60 วินาทีของธุรกรรม ในการดำเนินการนี้ใน Standard SQL เราสามารถเพิ่มความไม่เท่าเทียมกันในเงื่อนไข JOIN:
#standardSQL SELECT * FROM ( SELECT traff.clientId AS clientId, traff.page_path AS pagePath, traff.traffic_source AS startSource, traff.traffic_medium AS startMedium, traff.time AS startTime, aff.evAction AS evAction, aff.evSource AS finishSource, aff.evMedium AS finishMedium, aff.evCampaign AS finishCampaign, aff.time AS finishTime, aff.isTransaction AS isTransaction, aff.pagePath AS link, traff.time-aff.time AS diff FROM ( SELECT fullVisitorID AS clientId, h.page.pagePath AS page_path, trafficSource.source AS traffic_source, trafficSource.medium AS traffic_medium, trafficSource.campaign AS traffic_campaign, date, SAFE_CAST(visitStartTime+h.time/1000 AS INT64) AS time FROM `demoproject.google_analytics_sample.ga_sessions_20190301`, UNNEST (hits) AS h WHERE trafficSource.medium != 'cpa' ) AS traff JOIN ( SELECT total.date date, total.time time, total.clientId AS clientId, total.eventAction AS evAction, total.source AS evSource, total.medium AS evMedium, total.campaign AS evCampaign, tr.eventAction AS isTransaction, total.page_path AS pagePath FROM ( SELECT fullVisitorID AS clientId, h.page.pagePath AS page_path, h.eventInfo.eventAction AS eventAction, trafficSource.source AS source, trafficSource.medium AS medium, trafficSource.campaign AS campaign, date, SAFE_CAST(visitStartTime+h.time/1000 AS INT64) AS time FROM `demoproject.google_analytics_sample.ga_sessions_20190301`, UNNEST(hits) AS h WHERE trafficSource.medium ='cpa' ) AS total LEFT JOIN ( SELECT fullVisitorID AS clientId, date, h.eventInfo.eventAction AS eventAction, h.page.pagePath pagePath, SAFE_CAST(visitStartTime+h.time/1000 AS INT64) AS time FROM `demoproject.google_analytics_sample.ga_sessions_20190301`, UNNEST(hits) AS h WHERE h.eventInfo.eventAction = 'typ_page' AND h.type = 'EVENT' GROUP BY 1, 2, 3, 4, 5 ) AS tr ON total.clientId=tr.clientId AND total.date=tr.date AND tr.time>total.time -- JOIN tables by inequality. Pass the additional WHERE clause that was needed in Legacy SQL WHERE tr.eventAction = 'typ_page' ) AS aff ON traff.clientId = aff.clientId ) WHERE diff> -60 AND diff<0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ORDER BY clientId, finishTime
#standardSQL SELECT * FROM ( SELECT traff.clientId AS clientId, traff.page_path AS pagePath, traff.traffic_source AS startSource, traff.traffic_medium AS startMedium, traff.time AS startTime, aff.evAction AS evAction, aff.evSource AS finishSource, aff.evMedium AS finishMedium, aff.evCampaign AS finishCampaign, aff.time AS finishTime, aff.isTransaction AS isTransaction, aff.pagePath AS link, traff.time-aff.time AS diff FROM ( SELECT fullVisitorID AS clientId, h.page.pagePath AS page_path, trafficSource.source AS traffic_source, trafficSource.medium AS traffic_medium, trafficSource.campaign AS traffic_campaign, date, SAFE_CAST(visitStartTime+h.time/1000 AS INT64) AS time FROM `demoproject.google_analytics_sample.ga_sessions_20190301`, UNNEST (hits) AS h WHERE trafficSource.medium != 'cpa' ) AS traff JOIN ( SELECT total.date date, total.time time, total.clientId AS clientId, total.eventAction AS evAction, total.source AS evSource, total.medium AS evMedium, total.campaign AS evCampaign, tr.eventAction AS isTransaction, total.page_path AS pagePath FROM ( SELECT fullVisitorID AS clientId, h.page.pagePath AS page_path, h.eventInfo.eventAction AS eventAction, trafficSource.source AS source, trafficSource.medium AS medium, trafficSource.campaign AS campaign, date, SAFE_CAST(visitStartTime+h.time/1000 AS INT64) AS time FROM `demoproject.google_analytics_sample.ga_sessions_20190301`, UNNEST(hits) AS h WHERE trafficSource.medium ='cpa' ) AS total LEFT JOIN ( SELECT fullVisitorID AS clientId, date, h.eventInfo.eventAction AS eventAction, h.page.pagePath pagePath, SAFE_CAST(visitStartTime+h.time/1000 AS INT64) AS time FROM `demoproject.google_analytics_sample.ga_sessions_20190301`, UNNEST(hits) AS h WHERE h.eventInfo.eventAction = 'typ_page' AND h.type = 'EVENT' GROUP BY 1, 2, 3, 4, 5 ) AS tr ON total.clientId=tr.clientId AND total.date=tr.date AND tr.time>total.time -- JOIN tables by inequality. Pass the additional WHERE clause that was needed in Legacy SQL WHERE tr.eventAction = 'typ_page' ) AS aff ON traff.clientId = aff.clientId ) WHERE diff> -60 AND diff<0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ORDER BY clientId, finishTime
ข้อ จำกัด เพียงอย่างเดียวของ Standard SQL ที่เกี่ยวกับ JOIN คือไม่อนุญาตให้รวมกึ่งกับแบบสอบถามย่อยของแบบฟอร์ม WHERE คอลัมน์ใน (SELECT ...):
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE -- such a construction cannot be used in Standard SQL state IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE -- such a construction cannot be used in Standard SQL state IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
โอกาสผิดพลาดน้อย
ฟังก์ชันบางอย่างใน Legacy SQL จะคืนค่า NULL หากเงื่อนไขไม่ถูกต้อง ตัวอย่างเช่น หากการหารด้วยศูนย์ได้เล็ดลอดเข้ามาในการคำนวณของคุณ การสืบค้นจะถูกดำเนินการและรายการ NULL จะปรากฏในแถวผลลัพธ์ของตาราง ซึ่งอาจปิดบังปัญหาในแบบสอบถามหรือในข้อมูล
ตรรกะของ Standard SQL นั้นตรงไปตรงมามากกว่า หากเงื่อนไขหรือข้อมูลที่ป้อนไม่ถูกต้อง การสืบค้นจะสร้างข้อผิดพลาด เช่น «หารด้วยศูนย์» ดังนั้นคุณจึงสามารถแก้ไขแบบสอบถามได้อย่างรวดเร็ว การตรวจสอบต่อไปนี้ฝังอยู่ใน Standard SQL:
- ค่าที่ถูกต้องสำหรับ +, -, ×, SUM, AVG, STDEV
- การหารด้วยศูนย์
คำขอทำงานเร็วขึ้น
JOIN เคียวรีที่เขียนด้วย Standard SQL จะเร็วกว่าที่เขียนใน Legacy SQL เนื่องจากการกรองข้อมูลขาเข้าเบื้องต้น ขั้นแรก แบบสอบถามจะเลือกแถวที่ตรงกับเงื่อนไข JOIN จากนั้นจึงประมวลผล
ในอนาคต Google BigQuery จะพยายามปรับปรุงความเร็วและประสิทธิภาพของการสืบค้นข้อมูลสำหรับ Standard SQL เท่านั้น
แก้ไขตารางได้: แทรกและลบแถว, อัปเดต
ฟังก์ชัน Data Manipulation Language (DML) มีอยู่ใน Standard SQL ซึ่งหมายความว่าคุณสามารถอัปเดตตารางและเพิ่มหรือลบแถวออกจากตารางได้ผ่านหน้าต่างเดียวกับที่คุณเขียนคิวรี ตัวอย่างเช่น เมื่อใช้ DML คุณสามารถรวมข้อมูลจากสองตารางเป็นตารางเดียวได้:
#standardSQL MERGE dataset.Inventory AS T USING dataset.NewArrivals AS S ON T.ProductID = S.ProductID WHEN MATCHED THEN UPDATE SET quantity = T.quantity + S.quantity WHEN NOT MATCHED THEN INSERT (ProductID, quantity) VALUES (ProductID, quantity)
#standardSQL MERGE dataset.Inventory AS T USING dataset.NewArrivals AS S ON T.ProductID = S.ProductID WHEN MATCHED THEN UPDATE SET quantity = T.quantity + S.quantity WHEN NOT MATCHED THEN INSERT (ProductID, quantity) VALUES (ProductID, quantity)
รหัสง่ายต่อการอ่านและแก้ไข
เมื่อใช้ Standard SQL เคียวรีที่ซับซ้อนสามารถเริ่มได้ไม่เพียงแค่ SELECT เท่านั้น แต่ยังรวมถึง C อีกด้วย ทำให้อ่าน แสดงความคิดเห็น และเข้าใจโค้ดได้ง่ายขึ้น นอกจากนี้ยังหมายถึงการป้องกันตัวเองและแก้ไขข้อผิดพลาดของผู้อื่นได้ง่ายขึ้น
#standardSQL WITH total_1 AS ( -- the first subquery in which the intermediate indicator will be calculated SELECT id, metric1, SUM(metric2) AS total_sum1 FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD` GROUP BY id, metric ), total_2 AS ( -- the second subquery SELECT id, metric1, SUM(metric2) AS total_sum2 FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD` GROUP BY id, metric1 ), total_3 AS ( -- the third subquery SELECT id, metric, SUM(metric2) AS total_sum3 FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD` GROUP BY id, metric ) SELECT *, ROUND(100*( total_2.total_sum2 - total_3.total_sum3) / total_3.total_sum3, 3) AS difference -- get the difference index: subtract the value of the second subquery from the value of the third; divide by the value of the third FROM total_1 ORDER BY 1, 2
#standardSQL WITH total_1 AS ( -- the first subquery in which the intermediate indicator will be calculated SELECT id, metric1, SUM(metric2) AS total_sum1 FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD` GROUP BY id, metric ), total_2 AS ( -- the second subquery SELECT id, metric1, SUM(metric2) AS total_sum2 FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD` GROUP BY id, metric1 ), total_3 AS ( -- the third subquery SELECT id, metric, SUM(metric2) AS total_sum3 FROM `project_name.dataset_name.owoxbi_sessions_YYYYMMDD` GROUP BY id, metric ) SELECT *, ROUND(100*( total_2.total_sum2 - total_3.total_sum3) / total_3.total_sum3, 3) AS difference -- get the difference index: subtract the value of the second subquery from the value of the third; divide by the value of the third FROM total_1 ORDER BY 1, 2
สะดวกในการทำงานกับตัวดำเนินการ WITH หากคุณมีการคำนวณที่ทำเสร็จแล้วในหลายขั้นตอน ขั้นแรก คุณสามารถรวบรวมตัววัดระดับกลางในแบบสอบถามย่อย จากนั้นทำการคำนวณขั้นสุดท้าย
Google Cloud Platform (GCP) ซึ่งรวมถึง BigQuery เป็นแพลตฟอร์มครบวงจรสำหรับการทำงานกับบิ๊กดาต้า ตั้งแต่การจัดระเบียบคลังข้อมูลหรือดาต้าคลาวด์ ไปจนถึงการทดลองทางวิทยาศาสตร์และการวิเคราะห์เชิงคาดการณ์และเชิงกำหนด ด้วยการเปิดตัว Standard SQL ทำให้ BigQuery กำลังขยายกลุ่มเป้าหมาย การทำงานกับ GCP นั้นน่าสนใจยิ่งขึ้นสำหรับนักวิเคราะห์การตลาด นักวิเคราะห์ผลิตภัณฑ์ นักวิทยาศาสตร์ข้อมูล และทีมผู้เชี่ยวชาญอื่นๆ
ความสามารถของ Standard SQL และตัวอย่างกรณีการใช้งาน
ที่ OWOX BI เรามักจะทำงานกับตารางที่คอมไพล์โดยใช้การส่งออก Google Analytics 360 มาตรฐานไปยัง Google BigQuery หรือ OWOX BI Pipeline ในตัวอย่างด้านล่าง เราจะดูเฉพาะการสืบค้น SQL สำหรับข้อมูลดังกล่าว
หากคุณยังไม่ได้รวบรวมข้อมูลจากไซต์ของคุณใน BigQuery คุณสามารถลองทำได้ฟรีด้วย OWOX BI เวอร์ชันทดลอง
1. เลือกข้อมูลสำหรับช่วงเวลา
ใน Google BigQuery ข้อมูลพฤติกรรมผู้ใช้สำหรับไซต์ของคุณจะถูกเก็บไว้ในตารางไวด์การ์ด (ตารางที่มีเครื่องหมายดอกจัน) ตารางแยกถูกสร้างขึ้นในแต่ละวัน ตารางเหล่านี้มีชื่อเหมือนกัน: เฉพาะส่วนต่อท้ายเท่านั้นที่แตกต่างกัน คำต่อท้ายคือวันที่ในรูปแบบ YYYYMMDD ตัวอย่างเช่น ตาราง owoxbi_sessions_20190301 มีข้อมูลเกี่ยวกับเซสชันสำหรับวันที่ 1 มีนาคม 2019
เราสามารถอ้างถึงกลุ่มของตารางดังกล่าวโดยตรงในคำขอเดียวเพื่อรับข้อมูล ตัวอย่างเช่น ตั้งแต่วันที่ 1 กุมภาพันธ์ถึง 28 กุมภาพันธ์ 2019 ในการดำเนินการนี้ เราจำเป็นต้องแทนที่ YYYYMMDD ด้วย * ใน FROM และใน WHERE เราจำเป็นต้องระบุส่วนต่อท้ายตารางสำหรับจุดเริ่มต้นและจุดสิ้นสุดของช่วงเวลา:
#standardSQL SELECT sessionId, FROM `project_name.dataset_name.owoxbi_sessions_*` WHERE _TABLE_SUFFIX BETWEEN �' AND �'
#standardSQL SELECT sessionId, FROM `project_name.dataset_name.owoxbi_sessions_*` WHERE _TABLE_SUFFIX BETWEEN �' AND �'
เราไม่ทราบวันที่เฉพาะเจาะจงที่เราต้องการรวบรวมข้อมูล ตัวอย่างเช่น ทุกสัปดาห์เราอาจต้องวิเคราะห์ข้อมูลในช่วงสามเดือนที่ผ่านมา ในการดำเนินการนี้ เราสามารถใช้ฟังก์ชัน FORMAT_DATE:
#standardSQL SELECT <enumerate field names> FROM `project_name.dataset_name.owoxbi_sessions_*` WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 3 MONTHS)) AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
#standardSQL SELECT <enumerate field names> FROM `project_name.dataset_name.owoxbi_sessions_*` WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 3 MONTHS)) AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
หลังจาก BETWEEN เราบันทึกส่วนต่อท้ายของตารางแรก วลี CURRENT_DATE () INTERVAL 3 MONTHS หมายถึง «เลือกข้อมูลในช่วง 3 เดือนล่าสุดจากวันที่ปัจจุบัน» ส่วนต่อท้ายตารางที่สองจัดรูปแบบหลัง AND จำเป็นต้องทำเครื่องหมายจุดสิ้นสุดของช่วงเวลาเป็นเมื่อวาน: CURRENT_DATE (), INTERVAL 1 DAY
2. ดึงพารามิเตอร์ผู้ใช้และตัวบ่งชี้
พารามิเตอร์และเมตริกผู้ใช้ในตารางการส่งออกของ Google Analytics ถูกเขียนลงในตาราง Hit ที่ซ้อนกันและในตารางย่อย customDimensions และ customMetrics มิติข้อมูลที่กำหนดเองทั้งหมดจะถูกบันทึกไว้ในสองคอลัมน์: คอลัมน์แรกสำหรับจำนวนพารามิเตอร์ที่รวบรวมบนไซต์ คอลัมน์ที่สองสำหรับค่าของพารามิเตอร์ นี่คือลักษณะของพารามิเตอร์ทั้งหมดที่ส่งด้วยการโจมตีครั้งเดียว:

ในการแกะกล่องและเขียนพารามิเตอร์ที่จำเป็นในคอลัมน์แยกกัน เราใช้แบบสอบถาม SQL ต่อไปนี้:
-- Custom Dimensions (in the line below index - the number of the user variable, which is set in the Google Analytics interface; dimension1 is the name of the custom parameter, which you can change as you like. For each subsequent parameter, you need to write the same line: (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customDimensions)) AS dimension1, -- Custom Metrics: the index below is the number of the user metric specified in the Google Analytics interface; metric1 is the name of the metric, which you can change as you like. For each of the following metrics, you need to write the same line: (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customMetrics)) AS metric1
-- Custom Dimensions (in the line below index - the number of the user variable, which is set in the Google Analytics interface; dimension1 is the name of the custom parameter, which you can change as you like. For each subsequent parameter, you need to write the same line: (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customDimensions)) AS dimension1, -- Custom Metrics: the index below is the number of the user metric specified in the Google Analytics interface; metric1 is the name of the metric, which you can change as you like. For each of the following metrics, you need to write the same line: (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customMetrics)) AS metric1
นี่คือสิ่งที่ดูเหมือนในคำขอ:
#standardSQL SELECT <column name1>, <column_name2>, -- list column names (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customDimensions)) AS page_type, (SELECT MAX(IF(index=2, value, NULL)) FROM UNNEST(hits.customDimensions)) AS visitor_type, -- produce the necessary custom dimensions (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customMetrics)) AS metric1 -- produce the necessary custom metrics <column_name3> -- if you need more columns, continue to list FROM `project_name.dataset_name.owoxbi_sessions_20190201`
#standardSQL SELECT <column name1>, <column_name2>, -- list column names (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customDimensions)) AS page_type, (SELECT MAX(IF(index=2, value, NULL)) FROM UNNEST(hits.customDimensions)) AS visitor_type, -- produce the necessary custom dimensions (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customMetrics)) AS metric1 -- produce the necessary custom metrics <column_name3> -- if you need more columns, continue to list FROM `project_name.dataset_name.owoxbi_sessions_20190201`
ในภาพหน้าจอด้านล่าง เราได้เลือกพารามิเตอร์ 1 และ 2 จากข้อมูลสาธิต Google Analytics 360 ใน Google BigQuery และเรียกพารามิเตอร์ดังกล่าวว่า page_type และ client_id พารามิเตอร์แต่ละตัวจะถูกบันทึกในคอลัมน์แยก:


3. คำนวณจำนวนเซสชันตามแหล่งที่มาของการเข้าชม ช่องทาง แคมเปญ เมือง และหมวดหมู่อุปกรณ์
การคำนวณดังกล่าวมีประโยชน์หากคุณวางแผนที่จะแสดงข้อมูลเป็นภาพใน Google Data Studio และกรองตามหมวดหมู่เมืองและอุปกรณ์ ทำได้โดยง่ายด้วยฟังก์ชันหน้าต่าง COUNT:
#standardSQL SELECT <column_name 1>, -- choose any columns COUNT (DISTINCT sessionId) AS total_sessions, -- summarize the session IDs to find the total number of sessions COUNT(DISTINCT sessionId) OVER(PARTITION BY date, geoNetwork.city, session.device.deviceCategory, trafficSource.source, trafficSource.medium, trafficSource.campaign) AS part_sessions -- summarize the number of sessions by campaign, channel, traffic source, city, and device category FROM `project_name.dataset_name.owoxbi_sessions_20190201`
#standardSQL SELECT <column_name 1>, -- choose any columns COUNT (DISTINCT sessionId) AS total_sessions, -- summarize the session IDs to find the total number of sessions COUNT(DISTINCT sessionId) OVER(PARTITION BY date, geoNetwork.city, session.device.deviceCategory, trafficSource.source, trafficSource.medium, trafficSource.campaign) AS part_sessions -- summarize the number of sessions by campaign, channel, traffic source, city, and device category FROM `project_name.dataset_name.owoxbi_sessions_20190201`
4. รวมข้อมูลเดียวกันจากหลายตาราง
สมมติว่าคุณรวบรวมข้อมูลเกี่ยวกับคำสั่งซื้อที่เสร็จสมบูรณ์ในตาราง BigQuery หลายตาราง: ตารางหนึ่งรวบรวมคำสั่งซื้อทั้งหมดจากร้านค้า A อีกรายการหนึ่งรวบรวมคำสั่งซื้อจากร้านค้า B คุณต้องการรวมไว้ในตารางเดียวกับคอลัมน์เหล่านี้:
- client_id — ตัวเลขที่ระบุผู้ซื้อที่ไม่ซ้ำ
- transaction_created — เวลาสร้างคำสั่งซื้อในรูปแบบ TIMESTAMP
- transaction_id — หมายเลขคำสั่งซื้อ
- is_approved — ไม่ว่าคำสั่งซื้อจะได้รับการยืนยันหรือไม่
- transaction_revenue — จำนวนการสั่งซื้อ
ในตัวอย่างคำสั่งซื้อของเราตั้งแต่ 1 มกราคม 2018 ถึงเมื่อวานจะต้องอยู่ในตาราง เมื่อต้องการทำเช่นนี้ เลือกคอลัมน์ที่เหมาะสมจากแต่ละกลุ่มของตาราง กำหนดชื่อเดียวกัน และรวมผลลัพธ์กับ UNION ALL:
#standardSQL SELECT cid AS client_id, order_time AS transaction_created, order_status AS is_approved, order_number AS transaction_id FROM `project_name.dataset_name.table1_*` WHERE ( _TABLE_SUFFIX BETWEEN �' AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ) UNION ALL SELECT userId AS client_id, created_timestamp AS transaction_created, operator_mark AS is_approved, transactionId AS transaction_id FROM `project_name.dataset_name.table1_*` WHERE ( _TABLE_SUFFIX BETWEEN �' AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ) ORDER BY transaction_created DESC
#standardSQL SELECT cid AS client_id, order_time AS transaction_created, order_status AS is_approved, order_number AS transaction_id FROM `project_name.dataset_name.table1_*` WHERE ( _TABLE_SUFFIX BETWEEN �' AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ) UNION ALL SELECT userId AS client_id, created_timestamp AS transaction_created, operator_mark AS is_approved, transactionId AS transaction_id FROM `project_name.dataset_name.table1_*` WHERE ( _TABLE_SUFFIX BETWEEN �' AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ) ORDER BY transaction_created DESC
5. สร้างพจนานุกรมของกลุ่มช่องทางจราจร
เมื่อข้อมูลเข้าสู่ Google Analytics ระบบจะกำหนดกลุ่มของการเปลี่ยนแปลงเฉพาะโดยอัตโนมัติ: โดยตรง การค้นหาทั่วไป การค้นหาที่เสียค่าใช้จ่าย และอื่นๆ ในการระบุกลุ่มของแชแนล Google Analytics จะดูที่แท็ก UTM ของการเปลี่ยน นั่นคือ utm_source และ utm_medium คุณสามารถอ่านเพิ่มเติมเกี่ยวกับกลุ่มแชแนลและกฎคำจำกัดความได้ในความช่วยเหลือของ Google Analytics
หากไคลเอนต์ OWOX BI ต้องการกำหนดชื่อของตนเองให้กับกลุ่มของช่องสัญญาณ เราจะสร้างพจนานุกรม ซึ่งการเปลี่ยนแปลงเป็นของช่องสัญญาณเฉพาะ ในการดำเนินการนี้ เราใช้ตัวดำเนินการ CASE แบบมีเงื่อนไขและฟังก์ชัน REGEXP_CONTAINS ฟังก์ชันนี้เลือกค่าที่เกิดนิพจน์ทั่วไปที่ระบุ
เราขอแนะนำให้ใช้ชื่อจากรายการแหล่งที่มาของคุณใน Google Analytics ต่อไปนี้คือตัวอย่างวิธีเพิ่มเงื่อนไขดังกล่าวในเนื้อหาคำขอ:
#standardSQL SELECT CASE WHEN (REGEXP_CONTAINS (source, 'yandex') AND medium = 'referral' THEN 'Organic Search' WHEN (REGEXP_CONTAINS (source, 'yandex.market')) AND medium = 'referral' THEN 'Referral' WHEN (REGEXP_CONTAINS (source, '^(go.mail.ru|google.com)$') AND medium = 'referral') THEN 'Organic Search' WHEN medium = 'organic' THEN 'Organic Search' WHEN (medium = 'cpc') THEN 'Paid Search' WHEN REGEXP_CONTAINS (medium, '^(sending|email|mail)$') THEN 'Email' WHEN REGEXP_CONTAINS (source, '(mail|email|Mail)') THEN 'Email' WHEN REGEXP_CONTAINS (medium, '^(cpa)$') THEN 'Affiliate' WHEN medium = 'social' THEN 'Social' WHEN source = '(direct)' THEN 'Direct' WHEN REGEXP_CONTAINS (medium, 'banner|cpm') THEN 'Display' ELSE 'Other' END channel_group -- the name of the column in which the channel groups are written FROM `project_name.dataset_name.owoxbi_sessions_20190201`
#standardSQL SELECT CASE WHEN (REGEXP_CONTAINS (source, 'yandex') AND medium = 'referral' THEN 'Organic Search' WHEN (REGEXP_CONTAINS (source, 'yandex.market')) AND medium = 'referral' THEN 'Referral' WHEN (REGEXP_CONTAINS (source, '^(go.mail.ru|google.com)$') AND medium = 'referral') THEN 'Organic Search' WHEN medium = 'organic' THEN 'Organic Search' WHEN (medium = 'cpc') THEN 'Paid Search' WHEN REGEXP_CONTAINS (medium, '^(sending|email|mail)$') THEN 'Email' WHEN REGEXP_CONTAINS (source, '(mail|email|Mail)') THEN 'Email' WHEN REGEXP_CONTAINS (medium, '^(cpa)$') THEN 'Affiliate' WHEN medium = 'social' THEN 'Social' WHEN source = '(direct)' THEN 'Direct' WHEN REGEXP_CONTAINS (medium, 'banner|cpm') THEN 'Display' ELSE 'Other' END channel_group -- the name of the column in which the channel groups are written FROM `project_name.dataset_name.owoxbi_sessions_20190201`
วิธีเปลี่ยนเป็น Standard SQL
หากคุณยังไม่ได้เปลี่ยนเป็น Standard SQL คุณสามารถทำได้ทุกเมื่อ สิ่งสำคัญคือการหลีกเลี่ยงการผสมภาษาถิ่นในคำขอเดียว
ตัวเลือกที่ 1 สลับในอินเทอร์เฟซ Google BigQuery
SQL เดิมถูกใช้โดยค่าเริ่มต้นในอินเทอร์เฟซเก่าของ BigQuery หากต้องการสลับไปมาระหว่างภาษาถิ่น ให้คลิก แสดงตัวเลือก ใต้ช่องป้อนข้อความค้นหา และยกเลิกการเลือกช่อง ใช้ SQL ดั้งเดิม ที่อยู่ถัดจาก SQL Dialect

อินเทอร์เฟซใหม่ใช้ Standard SQL เป็นค่าเริ่มต้น ที่นี่ คุณต้องไปที่แท็บเพิ่มเติมเพื่อสลับภาษา:

ตัวเลือกที่ 2 เขียนคำนำหน้าที่จุดเริ่มต้นของคำขอ
หากคุณไม่ได้เลือกการตั้งค่าคำขอ คุณสามารถเริ่มต้นด้วยคำนำหน้าที่ต้องการ (#standardSQL หรือ #legacySQL):
#standardSQL SELECT weight_pounds, state, year, gestation_weeks FROM `bigquery-public-data.samples.natality` ORDER BY weight_pounds DESC LIMIT 10;
#standardSQL SELECT weight_pounds, state, year, gestation_weeks FROM `bigquery-public-data.samples.natality` ORDER BY weight_pounds DESC LIMIT 10;
ในกรณีนี้ Google BigQuery จะละเว้นการตั้งค่าในอินเทอร์เฟซและเรียกใช้การสืบค้นโดยใช้ภาษาถิ่นที่ระบุในคำนำหน้า
หากคุณมีมุมมองหรือบันทึกการค้นหาที่เปิดใช้งานตามกำหนดเวลาโดยใช้ Apps Script อย่าลืมเปลี่ยนค่าของ useLegacySql เป็น false ในสคริปต์:
var job = { configuration: { query: { query: 'INSERT INTO MyDataSet.MyFooBarTable (Id, Foo, Date) VALUES (1, \'bar\', current_Date);', useLegacySql: false }
var job = { configuration: { query: { query: 'INSERT INTO MyDataSet.MyFooBarTable (Id, Foo, Date) VALUES (1, \'bar\', current_Date);', useLegacySql: false }
ตัวเลือก 3 การเปลี่ยนไปใช้ Standard SQL สำหรับมุมมอง
หากคุณทำงานกับ Google BigQuery ไม่ได้ใช้งานกับตารางแต่ใช้มุมมอง คุณจะเข้าถึงมุมมองเหล่านั้นไม่ได้ในภาษา Standard SQL กล่าวคือ ถ้างานนำเสนอของคุณเขียนด้วย Legacy SQL คุณจะไม่สามารถเขียนคำขอลงใน Standard SQL ได้
ในการถ่ายโอนมุมมองไปยัง SQL มาตรฐาน คุณต้องเขียนแบบสอบถามที่สร้างขึ้นใหม่ด้วยตนเอง วิธีที่ง่ายที่สุดในการทำเช่นนี้คือผ่านอินเทอร์เฟซ BigQuery
1. เปิดมุมมอง:

2. คลิกรายละเอียด ข้อความค้นหาควรเปิดขึ้น และปุ่มแก้ไขแบบสอบถามจะปรากฏขึ้นด้านล่าง:

ตอนนี้คุณสามารถแก้ไขคำขอตามกฎของ Standard SQL
ถ้าคุณวางแผนที่จะใช้คำขอเป็นการนำเสนอต่อ ให้คลิก บันทึกมุมมอง หลังจากที่คุณแก้ไขเสร็จแล้ว
ความเข้ากันได้ คุณสมบัติทางไวยากรณ์ ตัวดำเนินการ ฟังก์ชัน
ความเข้ากันได้
ด้วยการใช้งาน Standard SQL คุณสามารถเข้าถึงข้อมูลที่จัดเก็บไว้ในบริการอื่นๆ ได้โดยตรงจาก BigQuery:
- ไฟล์บันทึก Google Cloud Storage
- บันทึกการทำธุรกรรมใน Google Bigtable
- ข้อมูลจากแหล่งอื่น
วิธีนี้ช่วยให้คุณใช้ผลิตภัณฑ์ Google Cloud Platform สำหรับงานวิเคราะห์ใดๆ รวมถึงการวิเคราะห์เชิงคาดการณ์และเชิงกำหนดตามอัลกอริทึมการเรียนรู้ของเครื่อง
ไวยากรณ์ข้อความค้นหา
โครงสร้างการสืบค้นในภาษา Standard เกือบจะเหมือนกับใน Legacy:
ชื่อของตารางและมุมมองแยกจากกันด้วยจุด (หยุดเต็ม) และข้อความค้นหาทั้งหมดอยู่ในเครื่องหมายเน้นหนัก: `project_name.data_name_name.table_name``bigquery-public-data.samples.natality`
ไวยากรณ์ทั้งหมดของข้อความค้นหาพร้อมคำอธิบายสิ่งที่รวมอยู่ในโอเปอเรเตอร์แต่ละตัวได้ ถูกคอมไพล์เป็นสคีมาในเอกสารประกอบของ BigQuery
คุณสมบัติของไวยากรณ์ SQL มาตรฐาน:
- ต้องใช้เครื่องหมายจุลภาคเพื่อแสดงรายการฟิลด์ในคำสั่ง SELECT
- หากคุณใช้ตัวดำเนินการ UNNEST หลัง FROM เครื่องหมายจุลภาคหรือ JOIN จะถูกวางไว้ก่อน UNNEST
- คุณไม่สามารถใส่เครื่องหมายจุลภาคก่อน FROM
- เครื่องหมายจุลภาคระหว่างสองข้อความค้นหาเท่ากับ CROSS JOIN ดังนั้นโปรดใช้ความระมัดระวัง
- เข้าร่วมสามารถทำได้ไม่เพียงโดยคอลัมน์หรือความเท่าเทียมกัน แต่โดยนิพจน์และความไม่เท่าเทียมกันโดยพลการ
- เป็นไปได้ที่จะเขียนแบบสอบถามย่อยที่ซับซ้อนในส่วนใด ๆ ของนิพจน์ SQL (ใน SELECT, FROM, WHERE เป็นต้น) ในทางปฏิบัติ ยังไม่สามารถใช้นิพจน์เช่น WHERE column_name IN (SELECT ...) เช่นเดียวกับในฐานข้อมูลอื่น
ผู้ประกอบการ
ใน Standard SQL ตัวดำเนินการกำหนดประเภทของข้อมูล ตัวอย่างเช่น อาร์เรย์จะเขียนด้วยวงเล็บ [] เสมอ ตัวดำเนินการใช้สำหรับการเปรียบเทียบ จับคู่นิพจน์เชิงตรรกะ (NOT, OR, AND) และในการคำนวณทางคณิตศาสตร์
ฟังก์ชั่น
Standard SQL รองรับคุณสมบัติมากกว่า Legacy: การรวมแบบดั้งเดิม (ผลรวม, จำนวน, ต่ำสุด, สูงสุด); ฟังก์ชันทางคณิตศาสตร์ สตริง และสถิติ และรูปแบบที่หายากเช่น HyperLogLog ++
ในภาษามาตรฐาน มีฟังก์ชันเพิ่มเติมสำหรับการทำงานกับวันที่และการประทับเวลา รายการคุณลักษณะทั้งหมดมีอยู่ในเอกสารของ Google ฟังก์ชันที่ใช้บ่อยที่สุดสำหรับการทำงานกับวันที่ สตริง การรวม และหน้าต่าง
1. ฟังก์ชันการรวม
COUNT (DISTINCT column_name) นับจำนวนค่าที่ไม่ซ้ำในคอลัมน์ ตัวอย่างเช่น สมมติว่าเราต้องนับจำนวนเซสชันจากอุปกรณ์มือถือในวันที่ 1 มีนาคม 2019 เนื่องจากหมายเลขเซสชันสามารถทำซ้ำได้ในหลายบรรทัด เราจึงต้องการนับเฉพาะค่าหมายเลขเซสชันที่ไม่ซ้ำ:
#standardSQL SELECT COUNT (DISTINCT sessionId) AS sessions FROM `project_name.dataset_name.owoxbi_sessions_20190301` WHERE device.deviceCategory = 'mobile'
#standardSQL SELECT COUNT (DISTINCT sessionId) AS sessions FROM `project_name.dataset_name.owoxbi_sessions_20190301` WHERE device.deviceCategory = 'mobile'
SUM (column_name) — ผลรวมของค่าในคอลัมน์
#standardSQL SELECT SUM (hits.transaction.transactionRevenue) AS revenue FROM `project_name.dataset_name.owoxbi_sessions_20190301`, UNNEST (hits) AS hits -- unpacking the nested field hits WHERE device.deviceCategory = 'mobile'
#standardSQL SELECT SUM (hits.transaction.transactionRevenue) AS revenue FROM `project_name.dataset_name.owoxbi_sessions_20190301`, UNNEST (hits) AS hits -- unpacking the nested field hits WHERE device.deviceCategory = 'mobile'
MIN (column_name) | MAX (column_name) — ค่าต่ำสุดและสูงสุดในคอลัมน์ ฟังก์ชันเหล่านี้สะดวกสำหรับตรวจสอบการแพร่กระจายของข้อมูลในตาราง
2. ฟังก์ชั่นหน้าต่าง (วิเคราะห์)
ฟังก์ชันวิเคราะห์จะพิจารณาค่าไม่ใช่สำหรับทั้งตารางแต่สำหรับบางหน้าต่าง ซึ่งเป็นชุดของแถวที่คุณสนใจ นั่นคือ คุณสามารถกำหนดเซ็กเมนต์ภายในตารางได้ ตัวอย่างเช่น คุณสามารถคำนวณ SUM (รายได้) ไม่ใช่สำหรับทุกสาย แต่สำหรับเมือง หมวดหมู่อุปกรณ์ และอื่นๆ คุณสามารถเปลี่ยนฟังก์ชันการวิเคราะห์ SUM, COUNT และ AVG ตลอดจนฟังก์ชันการรวมอื่นๆ ได้โดยเพิ่มเงื่อนไข OVER (PARTITION BY column_name) ให้กับฟังก์ชันเหล่านั้น
ตัวอย่างเช่น คุณต้องนับจำนวนเซสชันตามแหล่งที่มาของการเข้าชม ช่องทาง แคมเปญ เมือง และหมวดหมู่อุปกรณ์ ในกรณีนี้ เราสามารถใช้นิพจน์ต่อไปนี้:
SELECT date, geoNetwork.city, t.device.deviceCategory, trafficSource.source, trafficSource.medium, trafficSource.campaign, COUNT(DISTINCT sessionId) OVER(PARTITION BY date, geoNetwork.city, session.device.deviceCategory, trafficSource.source, trafficSource.medium, trafficSource.campaign) AS segmented_sessions FROM `project_name.dataset_name.owoxbi_sessions_20190301` t
SELECT date, geoNetwork.city, t.device.deviceCategory, trafficSource.source, trafficSource.medium, trafficSource.campaign, COUNT(DISTINCT sessionId) OVER(PARTITION BY date, geoNetwork.city, session.device.deviceCategory, trafficSource.source, trafficSource.medium, trafficSource.campaign) AS segmented_sessions FROM `project_name.dataset_name.owoxbi_sessions_20190301` t
OVER กำหนดหน้าต่างที่จะทำการคำนวณ PARTITION BY ระบุว่าแถวใดควรถูกจัดกลุ่มสำหรับการคำนวณ ในบางฟังก์ชัน จำเป็นต้องระบุลำดับของการจัดกลุ่มด้วย ORDER BY
สำหรับรายการฟังก์ชันหน้าต่างทั้งหมด โปรดดูเอกสาร BigQuery
3. ฟังก์ชันสตริง
สิ่งเหล่านี้มีประโยชน์เมื่อคุณต้องการเปลี่ยนข้อความ จัดรูปแบบข้อความในบรรทัด หรือติดค่าของคอลัมน์ ตัวอย่างเช่น ฟังก์ชันสตริงเหมาะอย่างยิ่งหากคุณต้องการสร้างตัวระบุเซสชันที่ไม่ซ้ำจากข้อมูลการส่งออกมาตรฐานของ Google Analytics 360 พิจารณาฟังก์ชันสตริงที่ได้รับความนิยมมากที่สุด
SUBSTR ตัดส่วนของสตริง ในคำขอ ฟังก์ชันนี้เขียนเป็น SUBSTR (string_name, 0.4) ตัวเลขแรกระบุจำนวนอักขระที่จะข้ามจากจุดเริ่มต้นของบรรทัด และตัวเลขที่สองระบุจำนวนหลักที่จะตัด ตัวอย่างเช่น สมมติว่าคุณมีคอลัมน์วันที่ที่มีวันที่ในรูปแบบ STRING ในกรณีนี้ วันที่จะมีลักษณะดังนี้: 20190103 หากคุณต้องการแยกปีจากบรรทัดนี้ SUBSTR จะช่วยคุณ:
#standardSQL SELECT SUBSTR(date,0,4) AS year FROM `project_name.dataset_name.owoxbi_sessions_20190301`
#standardSQL SELECT SUBSTR(date,0,4) AS year FROM `project_name.dataset_name.owoxbi_sessions_20190301`
CONCAT (column_name ฯลฯ) ยึดค่าไว้ ลองใช้คอลัมน์วันที่จากตัวอย่างก่อนหน้านี้ สมมติว่าคุณต้องการให้บันทึกวันที่ทั้งหมดดังนี้: 2019-03-01 ในการแปลงวันที่จากรูปแบบปัจจุบันเป็นรูปแบบนี้ คุณสามารถใช้ฟังก์ชันสตริงสองฟังก์ชัน: ขั้นแรก ตัดส่วนที่จำเป็นของสตริงด้วย SUBSTR จากนั้นจึงติดกาวผ่านยัติภังค์:
#standardSQL SELECT CONCAT(SUBSTR(date,0,4),"-",SUBSTR(date,5,2),"-",SUBSTR(date,7,2)) AS date FROM `project_name.dataset_name.owoxbi_sessions_20190301`
#standardSQL SELECT CONCAT(SUBSTR(date,0,4),"-",SUBSTR(date,5,2),"-",SUBSTR(date,7,2)) AS date FROM `project_name.dataset_name.owoxbi_sessions_20190301`
REGEXP_CONTAINS ส่งคืนค่าของคอลัมน์ที่เกิดนิพจน์ทั่วไป:
#standardSQL SELECT CASE WHEN REGEXP_CONTAINS (medium, '^(sending|email|mail)$') THEN 'Email' WHEN REGEXP_CONTAINS (source, '(mail|email|Mail)') THEN 'Email' WHEN REGEXP_CONTAINS (medium, '^(cpa)$') THEN 'Affiliate' ELSE 'Other' END Channel_groups FROM `project_name.dataset_name.owoxbi_sessions_20190301`
#standardSQL SELECT CASE WHEN REGEXP_CONTAINS (medium, '^(sending|email|mail)$') THEN 'Email' WHEN REGEXP_CONTAINS (source, '(mail|email|Mail)') THEN 'Email' WHEN REGEXP_CONTAINS (medium, '^(cpa)$') THEN 'Affiliate' ELSE 'Other' END Channel_groups FROM `project_name.dataset_name.owoxbi_sessions_20190301`
ฟังก์ชันนี้สามารถใช้ได้ทั้งใน SELECT และ WHERE ตัวอย่างเช่น ใน WHERE คุณสามารถเลือกหน้าที่ต้องการได้:
WHERE REGEXP_CONTAINS(hits.page.pagePath, 'land[123]/|/product-order')
WHERE REGEXP_CONTAINS(hits.page.pagePath, 'land[123]/|/product-order')
4. ฟังก์ชั่นวันที่
บ่อยครั้ง วันที่ในตารางจะถูกบันทึกในรูปแบบ STRING หากคุณวางแผนที่จะแสดงผลลัพธ์ใน Google Data Studio วันที่ในตารางจะต้องแปลงเป็นรูปแบบ DATE โดยใช้ฟังก์ชัน PARSE_DATE
PARSE_DATE แปลง STRING ของรูปแบบ 1900-01-01 เป็นรูปแบบ DATE
หากวันที่ในตารางของคุณดูแตกต่างออกไป (เช่น 19000101 หรือ 01_01_1900) คุณต้องแปลงเป็นรูปแบบที่ระบุก่อน
#standardSQL SELECT PARSE_DATE('%Y-%m-%d', date) AS date_new FROM `project_name.dataset_name.owoxbi_sessions_20190301`
#standardSQL SELECT PARSE_DATE('%Y-%m-%d', date) AS date_new FROM `project_name.dataset_name.owoxbi_sessions_20190301`
DATE_DIFF คำนวณระยะเวลาที่ผ่านไประหว่างวันที่สองวันในหน่วยวัน สัปดาห์ เดือน หรือปี มีประโยชน์หากคุณต้องการกำหนดช่วงเวลาระหว่างเวลาที่ผู้ใช้เห็นโฆษณาและทำการสั่งซื้อ ลักษณะการทำงานในคำขอมีลักษณะดังนี้:
#standardSQL SELECT DATE_DIFF( PARSE_DATE('%Y%m%d', date1), PARSE_DATE('%Y%m%d', date2), DAY ) days -- convert the date1 and date2 lines to the DATE format; choose units to show the difference (DAY, WEEK, MONTH, etc.) FROM `project_name.dataset_name.owoxbi_sessions_20190301`
#standardSQL SELECT DATE_DIFF( PARSE_DATE('%Y%m%d', date1), PARSE_DATE('%Y%m%d', date2), DAY ) days -- convert the date1 and date2 lines to the DATE format; choose units to show the difference (DAY, WEEK, MONTH, etc.) FROM `project_name.dataset_name.owoxbi_sessions_20190301`
หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับฟังก์ชันที่ระบุไว้ โปรดอ่านคุณลักษณะของ BigQuery ของ Google — การตรวจสอบโดยละเอียด
แบบสอบถาม SQL สำหรับรายงานการตลาด
ภาษา Standard SQL ช่วยให้ธุรกิจสามารถดึงข้อมูลสูงสุดจากข้อมูลด้วยการแบ่งส่วนลึก การตรวจสอบทางเทคนิค การวิเคราะห์ KPI ทางการตลาด และการระบุผู้รับเหมาที่ไม่เป็นธรรมในเครือข่าย CPA ต่อไปนี้คือตัวอย่างปัญหาทางธุรกิจที่การสืบค้น SQL เกี่ยวกับข้อมูลที่รวบรวมใน Google BigQuery จะช่วยคุณได้
1. การวิเคราะห์ ROPO: ประเมินการมีส่วนร่วมของแคมเปญออนไลน์ต่อการขายออฟไลน์ ในการวิเคราะห์ ROPO คุณต้องรวมข้อมูลเกี่ยวกับพฤติกรรมผู้ใช้ออนไลน์กับข้อมูลจาก CRM ระบบติดตามการโทร และแอปพลิเคชันมือถือ
หากมีคีย์ในฐานหนึ่งและฐานสอง ซึ่งเป็นพารามิเตอร์ทั่วไปที่ไม่ซ้ำกันสำหรับผู้ใช้แต่ละราย (เช่น ID ผู้ใช้) คุณสามารถติดตาม:
ที่ผู้ใช้เข้าเยี่ยมชมเว็บไซต์ก่อนซื้อสินค้าในร้าน
พฤติกรรมของผู้ใช้บนเว็บไซต์
ระยะเวลาที่ผู้ใช้ตัดสินใจซื้อ
แคมเปญใดมีการซื้อแบบออฟไลน์เพิ่มขึ้นมากที่สุด
2. แบ่งกลุ่มลูกค้าตามพารามิเตอร์ต่างๆ ตั้งแต่พฤติกรรมบนไซต์ (หน้าที่เข้าชม สินค้าที่ดู จำนวนการเข้าชมไซต์ก่อนซื้อ) ไปจนถึงหมายเลขบัตรสะสมคะแนนและรายการที่ซื้อ
3. ค้นหาว่าพันธมิตร CPA รายใดกำลังทำงานโดยไม่เจตนาและแทนที่แท็ก UTM
4. วิเคราะห์ความคืบหน้าของผู้ใช้ผ่านช่องทางการขาย
เราได้เตรียมการสืบค้นข้อมูลในภาษา Standard SQL หากคุณรวบรวมข้อมูลจากไซต์ของคุณ จากแหล่งโฆษณา และจากระบบ CRM ใน Google BigQuery แล้ว คุณสามารถใช้เทมเพลตเหล่านี้เพื่อแก้ปัญหาทางธุรกิจของคุณได้ เพียงแทนที่ชื่อโปรเจ็กต์ ชุดข้อมูล และตารางใน BigQuery ด้วยของคุณเอง ในคอลเล็กชัน คุณจะได้รับ 11 คิวรี SQL
สำหรับข้อมูลที่รวบรวมโดยใช้การส่งออกมาตรฐานจาก Google Analytics 360 ไปยัง Google BigQuery:
- การกระทำของผู้ใช้ในบริบทของพารามิเตอร์ใดๆ
- สถิติการดำเนินการที่สำคัญของผู้ใช้
- ผู้ใช้ที่ดูหน้าผลิตภัณฑ์เฉพาะ
- การกระทำของผู้ใช้ที่ซื้อผลิตภัณฑ์เฉพาะ
- ตั้งค่าช่องทางด้วยขั้นตอนที่จำเป็น
- ประสิทธิผลของไซต์การค้นหาภายใน
สำหรับข้อมูลที่รวบรวมใน Google BigQuery โดยใช้ OWOX BI:
- การบริโภคตามแหล่งที่มาและช่องทาง
- ต้นทุนเฉลี่ยในการดึงดูดผู้เข้าชมตามเมือง
- ROAS สำหรับกำไรขั้นต้นตามแหล่งที่มาและช่องทาง
- จำนวนคำสั่งซื้อใน CRM ตามวิธีการชำระเงินและวิธีการจัดส่ง
- เวลาจัดส่งเฉลี่ยตามเมือง
หากคุณมีคำถามเกี่ยวกับการสืบค้นข้อมูล Google BigQuery ที่คุณไม่พบคำตอบในบทความนี้ ให้ถามในความคิดเห็น เราจะพยายามช่วยคุณ