תחביר, פונקציות ואופרטורים של SQL מדור קודם
במסמך הזה מפורטים התחביר, הפונקציות והאופרטורים של שאילתות SQL מדור קודם. תחביר השאילתות המועדף ב-BigQuery הוא תחביר GoogleSQL. מידע נוסף מופיע במאמר בנושא זמינות התכונות של SQL מדור קודם.
תחביר של שאילתות
הערה: מילות מפתח לא תלויות באותיות רישיות. במסמך הזה, מילות מפתח כמו SELECT מופיעות באותיות רישיות לצורך המחשה.
פסוקית SELECT
הפסקה SELECT מציינת רשימה של ביטויים לחישוב. ביטויים בסעיף SELECT יכולים להכיל שמות של שדות, ערכים קבועים וקריאות לפונקציות (כולל פונקציות מצטברות ופונקציות חלון), וגם שילובים של שלושתם. רשימת הביטויים מופרדת בפסיקים.
אפשר לתת לכל ביטוי כינוי על ידי הוספת רווח ואחריו מזהה אחרי הביטוי. כדי לשפר את הקריאות, אפשר להוסיף את מילת המפתח האופציונלית AS בין הביטוי לבין הכינוי. אפשר להפנות לכינויים שמוגדרים בסעיף SELECT בסעיפים GROUP BY, HAVING ו-ORDER BY של השאילתה, אבל לא בסעיפים FROM, WHERE או OMIT RECORD IF ולא בביטויים אחרים באותו סעיף SELECT.
הערות:
-
אם משתמשים בפונקציית צבירה במשפט
SELECT, צריך להשתמש בפונקציית צבירה בכל הביטויים, או שהשאילתה צריכה לכלול משפטGROUP BYשכולל את כל השדות שלא עברו צבירה במשפטSELECTכמפתחות קיבוץ. לדוגמה:#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
-
אפשר להשתמש בסוגריים מרובעים כדי לבטל את המשמעות של מילים שמורות, כך שאפשר להשתמש בהן כשמות שדות וכינויים. לדוגמה, אם יש לכם עמודה בשם partition, שהיא מילה שמורה בתחביר של BigQuery, השאילתות שמפנות לשדה הזה ייכשלו עם הודעות שגיאה לא ברורות, אלא אם תשתמשו בסוגריים מרובעים כדי לסמן בתו בריחה (escape) את המילה הזו:
SELECT [partition] FROM ...
דוגמה
בדוגמה הזו מוגדרים כינויים בסעיף SELECT, ואז נעשה שימוש באחד מהם בסעיף ORDER BY. שימו לב שלא ניתן להפנות לעמודה word באמצעות word_alias בסעיף WHERE, אלא רק באמצעות השם שלה. גם הכינוי len לא מופיע בסעיף WHERE. הוא יהיה גלוי לסעיף HAVING.
#legacySQL SELECT word AS word_alias, LENGTH(word) AS len FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS 'th' ORDER BY len;
המשנה WITHIN לפונקציות צבירה
aggregate_function WITHIN RECORD [ [ AS ] alias ]
מילת המפתח WITHIN גורמת לפונקציית הצבירה לצבור ערכים חוזרים בכל רשומה. לכל רשומת קלט תופק בדיוק רשומת פלט אחת של נתונים מצטברים. סוג הצבירה הזה נקרא צבירה בהיקף. מכיוון שצבירה בהיקף מוגבל
מפיקה פלט לכל רשומה, אפשר לבחור ביטויים לא מצטברים לצד ביטויים מצטברים בהיקף מוגבל בלי להשתמש בסעיף GROUP BY.
ברוב המקרים, תשתמשו בהיקף RECORD כשמשתמשים בצבירה בהיקף מוגדר. אם יש לכם סכימה מורכבת מאוד עם קינון וחזרה, יכול להיות שתצטרכו לבצע צבירות בהיקפים של רשומות משנה. כדי לעשות את זה, מחליפים את מילת המפתח RECORD בתחביר שלמעלה בשם הצומת בסכימה שבה רוצים לבצע את הצבירה.
מידע נוסף על ההתנהגות המתקדמת הזו זמין במאמר בנושא טיפול בנתונים.
דוגמה
בדוגמה הזו מתבצעת COUNT אגרגציה בהיקף מוגבל, ואז הרשומות מסוננות וממוינות לפי הערך המצטבר.
#legacySQL SELECT repository.url, COUNT(payload.pages.page_name) WITHIN RECORD AS page_count FROM [bigquery-public-data:samples.github_nested] HAVING page_count > 80 ORDER BY page_count DESC;
סעיף FROM
FROM [project_name:]datasetId.tableId [ [ AS ] alias ] | (subquery) [ [ AS ] alias ] |JOINclause |FLATTENclause | table wildcard function
בסעיף FROM מציינים את נתוני המקור שרוצים לשלוף. אפשר להריץ שאילתות ב-BigQuery ישירות על טבלאות, על שאילתות משנה, על טבלאות שצורפו ועל טבלאות ששונו על ידי אופרטורים מיוחדים שמתוארים בהמשך. אפשר ליצור שאילתות על שילובים של מקורות הנתונים האלה באמצעות הפסיק, שהוא האופרטור UNION ALL ב-BigQuery.
הפניה לטבלאות
כשמתייחסים לטבלה, צריך לציין גם את datasetId וגם את tableId. לא חובה לציין את project_name. אם לא מציינים את project_name, BigQuery בוחר כברירת מחדל את הפרויקט הנוכחי. אם שם הפרויקט כולל מקף, צריך להקיף את כל ההפניה לטבלה בסוגריים.
דוגמה
[my-dashed-project:dataset1.tableName]
אפשר לתת לטבלאות כינוי על ידי הוספת רווח ואחריו מזהה אחרי שם הטבלה. אפשר להוסיף את מילת המפתח האופציונלית AS בין tableId לבין הכינוי כדי לשפר את הקריאות.
כשמפנים לעמודות מטבלה, אפשר להשתמש בשם הפשוט של העמודה או להוסיף לשם העמודה קידומת של הכינוי, אם צוין כזה, או של datasetId ו-tableId, כל עוד לא צוין project_name. אי אפשר לכלול את project_name בקידומת של העמודה כי התו ':' אסור בשמות של שדות.
דוגמאות
בדוגמה הזו יש הפניה לעמודה ללא קידומת של טבלה.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare];
בדוגמה הזו, שם העמודה מתחיל ב-datasetId וב-tableId. שימו לב שלא ניתן לכלול את project_name בדוגמה הזו. השיטה הזו תפעל רק אם מערך הנתונים נמצא בפרויקט ברירת המחדל הנוכחי שלכם.
#legacySQL SELECT samples.shakespeare.word FROM samples.shakespeare;
בדוגמה הזו, שם העמודה מתחיל בכינוי של הטבלה.
#legacySQL SELECT t.word FROM [bigquery-public-data:samples.shakespeare] AS t;
טבלאות מחולקות למחיצות (Partitions) לפי טווח של מספרים שלמים
ב-SQL מדור קודם אפשר להשתמש במאפייני עיצוב של טבלה כדי להתייחס למחיצה ספציפית בטבלה שמחולקת למחיצות לפי טווח של מספרים שלמים. הנתון החשוב ביותר במחיצת טווח הוא תחילת הטווח.
בדוגמה הבאה מוצגת שאילתה על חלוקת הטווח שמתחילה ב-30:
#legacySQL SELECT * FROM dataset.table$30;
שימו לב: אי אפשר להשתמש ב-SQL מדור קודם כדי להריץ שאילתות על טבלה מחולקת למחיצות לפי טווח של מספרים שלמים. במקום זאת, השאילתה מחזירה שגיאה כמו זו:
Querying tables partitioned on a field is not supported in Legacy SQL
שימוש בשאילתות משנה
שאילתת משנה היא משפט SELECT מקונן שמוקף בסוגריים. הביטויים שמחושבים בסעיף SELECT של שאילתת המשנה זמינים לשאילתה החיצונית בדיוק כמו עמודות של טבלה.
אפשר להשתמש בשאילתות משנה כדי לחשב צבירות וביטויים אחרים. כל האופרטורים של SQL זמינים בשאילתת המשנה. כלומר, שאילתת משנה יכולה להכיל בעצמה שאילתות משנה אחרות, שאילתות משנה יכולות לבצע צירופים וצבירות של קיבוצים וכו'.
פסיק בתור UNION ALL
בניגוד ל-GoogleSQL, ב-SQL מדור קודם משתמשים בפסיק כאופרטור UNION ALL ולא כאופרטור CROSS JOIN. זו התנהגות מדור קודם שהתפתחה כי בעבר BigQuery לא תמך ב-CROSS JOIN, והמשתמשים ב-BigQuery נדרשו לכתוב שאילתות UNION ALL באופן קבוע. ב-GoogleSQL, שאילתות שמבצעות איחודים הן מפורטות במיוחד. שימוש בפסיק כאופרטור איחוד מאפשר לכתוב שאילתות כאלה בצורה יעילה הרבה יותר. לדוגמה, אפשר להשתמש בשאילתה הזו כדי להריץ שאילתה אחת על יומנים מכמה ימים.
#legacySQL SELECT FORMAT_UTC_USEC(event.timestamp_in_usec) AS time, request_url FROM [applogs.events_20120501], [applogs.events_20120502], [applogs.events_20120503] WHERE event.username = 'root' AND NOT event.source_ip.is_internal;
בדרך כלל, שאילתות שמבצעות איחוד של מספר גדול של טבלאות רצות לאט יותר משאילתות שמבצעות עיבוד של אותה כמות נתונים מטבלה אחת. ההבדל בביצועים יכול להגיע ל-50 אלפיות השנייה לכל טבלה נוספת. שאילתה אחת יכולה לאחד לכל היותר 1,000 טבלאות.
פונקציות של תווים כלליים לחיפוש בטבלאות
המונח פונקציית תו כללי לחיפוש בטבלאות מתייחס לסוג מיוחד של פונקציה שייחודית ל-BigQuery.
הפונקציות האלה משמשות בסעיף FROM כדי להתאים אוסף של שמות טבלאות באמצעות אחד מכמה סוגים של מסננים. לדוגמה, אפשר להשתמש בפונקציה TABLE_DATE_RANGE כדי לשלוח שאילתה רק לגבי קבוצה ספציפית של טבלאות יומיות. מידע נוסף על הפונקציות האלה זמין במאמר פונקציות של תו כללי לחיפוש בטבלאות.
האופרטור FLATTEN
(FLATTEN([project_name:]datasetId.tableId, field_to_be_flattened)) (FLATTEN((subquery), field_to_be_flattened))
בניגוד למערכות טיפוסיות לעיבוד SQL, BigQuery מיועד לטיפול בנתונים חוזרים. לכן, משתמשי BigQuery צריכים לפעמים לכתוב שאילתות שמשנות את המבנה של רשומות חוזרות. אחת הדרכים לעשות זאת היא באמצעות האופרטור FLATTEN.
FLATTEN ממירה צומת אחד בסכימה מחוזר לאופציונלי. בהינתן רשומה
עם ערך אחד או יותר בשדה חוזר, הפונקציה FLATTEN תיצור כמה רשומות,
אחת לכל ערך בשדה החוזר. כל השדות האחרים שנבחרו מהרשומה משוכפלים בכל רשומת פלט חדשה. אפשר להשתמש ב-FLATTEN שוב ושוב כדי להסיר כמה רמות של חזרה.
מידע נוסף ודוגמאות מופיעים במאמר התמודדות עם נתונים.
האופרטור JOIN
BigQuery תומך בכמה אופרטורים של JOIN בכל סעיף FROM.
פעולות JOIN עוקבות משתמשות בתוצאות של פעולת JOIN קודמת כקלט JOIN שמאלי. אפשר להשתמש בשדות מכל קלט JOIN קודם כמפתחות בסעיפי ON של אופרטורים עוקבים של JOIN.
סוגי JOIN
BigQuery תומך בפעולות INNER, [FULL|RIGHT|LEFT] OUTER ו-CROSS JOIN. אם לא מציינים ערך, ברירת המחדל היא INNER.
אי אפשר להשתמש בסעיפים ON בפעולות CROSS JOIN. CROSS JOIN
יכולה להחזיר כמות גדולה של נתונים, ולגרום לשאילתה איטית ולא יעילה או לשאילתה שחורגת מהמשאבים המקסימליים המותרים לכל שאילתה. השאילתות האלה ייכשלו ויוצג בהן שגיאה. כשאפשר, עדיף להשתמש בשאילתות שלא כוללות את CROSS JOIN. לדוגמה, לעיתים קרובות נעשה שימוש ב-CROSS JOIN
במקומות שבהם פונקציות אנליטיות יהיו יעילות יותר.
הערך המקדם EACH
המשנה EACH הוא רמז שאומר ל-BigQuery להפעיל את JOIN
באמצעות כמה מחיצות. האפשרות הזו שימושית במיוחד כששני הצדדים של
JOIN גדולים. אי אפשר להשתמש במתאם EACH בסעיפים של CROSS JOIN.
EACH בעבר עודדנו שימוש בשיטה הזו במקרים רבים, אבל זה כבר לא המצב. כשאפשר, כדאי להשתמש ב-JOIN בלי ההרחבה EACH כדי לשפר את הביצועים.
משתמשים ב-JOIN EACH כשהשאילתה נכשלה ומופיעה הודעת שגיאה על חריגה ממגבלות המשאבים.
Semi-join ו-Anti-join
בנוסף לתמיכה ב-JOIN בסעיף FROM, BigQuery תומך גם בשני סוגים של צירופים בסעיף WHERE: צירוף חלקי וצירוף חלקי הפוך. semi-join מצוין באמצעות מילת המפתח IN עם שאילתת משנה; anti-join מצוין באמצעות מילות המפתח NOT IN.
דוגמאות
השאילתה הבאה משתמשת ב-semi-join כדי למצוא n-גרמות שבהן המילה הראשונה ב-n-גרמה היא גם המילה השנייה ב-n-גרמה אחרת, שבה המילה השלישית היא AND.
#legacySQL SELECT ngram FROM [bigquery-public-data:samples.trigrams] WHERE first IN (SELECT second FROM [bigquery-public-data:samples.trigrams] WHERE third = "AND") LIMIT 10;
השאילתה הבאה משתמשת ב-semi-join כדי להחזיר את מספר הנשים מעל גיל 50 שילדו ב-10 המדינות עם מספר הלידות הגבוה ביותר.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE 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
כדי לראות את המספרים של 40 המדינות האחרות, אפשר להשתמש ב-anti-join. השאילתה הבאה כמעט זהה לדוגמה הקודמת, אבל היא משתמשת ב-NOT IN במקום ב-IN כדי להחזיר את מספר הנשים מעל גיל 50 שילדו ב-40 המדינות עם הכי פחות לידות.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state NOT 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
הערות:
- BigQuery לא תומך בצירופים חצי-פנימיים או חצי-חיצוניים מתואמים. שאילתת המשנה לא יכולה להפנות לשדות משאילתת החוץ.
- שאילתת המשנה שמשמשת בצירוף חצי או בצירוף חצי הפוך חייבת לבחור שדה אחד בדיוק.
-
הסוגים של השדה שנבחר והשדה שנעשה בו שימוש מהשאילתה החיצונית בסעיף
WHEREחייבים להיות זהים לחלוטין. מערכת BigQuery לא תבצע המרה של טיפוסי נתונים עבור הצטרפויות חלקיות או הצטרפויות חלקיות הפוכות.
סעיף WHERE
הפסקה WHERE, שנקראת לפעמים predicate, מסננת רשומות שנוצרו על ידי הפסקה FROM באמצעות ביטוי בוליאני. אפשר לשלב כמה תנאים באמצעות סעיפי AND ו-OR בוליאניים, ואפשר גם להוסיף סוגריים – () – כדי לקבץ אותם. אין צורך לבחור את השדות שמופיעים במשפט WHERE במשפט SELECT התואם, וביטוי המשפט WHERE לא יכול להפנות לביטויים שמחושבים במשפט SELECT של השאילתה שאליה משתייך המשפט WHERE.
הערה: אי אפשר להשתמש בפונקציות מצטברות בסעיף WHERE. אם אתם צריכים לסנן את הפלט של פונקציית צבירה, אתם יכולים להשתמש בסעיף HAVING ובשאילתה חיצונית.
דוגמה
בדוגמה הבאה נעשה שימוש בביטויים בוליאניים מופרדים בסעיף WHERE
– שני הביטויים מחוברים באמצעות האופרטור OR. רשומת קלט תעבור את המסנן WHERE אם אחד מהביטויים יחזיר true.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare] WHERE (word CONTAINS 'prais' AND word CONTAINS 'ing') OR (word CONTAINS 'laugh' AND word CONTAINS 'ed');
השמטת רשומת IF
הפסקה OMIT RECORD IF היא מבנה שייחודי ל-BigQuery. האפשרות הזו שימושית במיוחד כשמדובר בסכימות חוזרות או בסכימות בתוך סכימות. היא דומה לסעיף WHERE
, אבל שונה ממנו בשני היבטים חשובים. קודם כול, המערכת משתמשת בתנאי שלילה, כלומר, הרשומות מושמטות אם הביטוי מחזיר true, אבל נשמרות אם הביטוי מחזיר false או null. שנית, בסעיף OMIT RECORD IF
אפשר להשתמש (ובדרך כלל משתמשים) בפונקציות צבירה עם היקף בתנאי.
בנוסף לסינון רשומות מלאות, אפשר לציין היקף מצומצם יותר כדי לסנן רק חלקים מרשומה.OMIT...IF כדי לעשות את זה, משתמשים בשם של צומת שאינו עלה בסכימה, במקום RECORD בסעיף OMIT...IF. משתמשי BigQuery משתמשים בפונקציונליות הזו לעיתים רחוקות. במאמרי העזרה בנושא WITHIN שצוינו למעלה יש קישור למאמרי עזרה נוספים בנושא ההתנהגות המתקדמת הזו.
אם משתמשים ב-OMIT...IF
כדי להחריג חלק מרשומה בשדה חוזר, והשאילתה גם בוחרת שדות חוזרים אחרים באופן עצמאי, BigQuery משמיט חלק מהרשומות החוזרות האחרות בשאילתה. אם רואים את השגיאה
Cannot perform OMIT IF on repeated scope <scope> with independently repeating pass through field <field>,
מומלץ לעבור ל-GoogleSQL. מידע על העברת הצהרות OMIT...IF ל-GoogleSQL זמין במאמר העברה ל-GoogleSQL.
דוגמה
אם נחזור לדוגמה שבה השתמשנו במודיפייר WITHIN, אפשר להשתמש ב-OMIT RECORD IF
כדי להשיג את אותה התוצאה שבה השתמשנו ב-WITHIN וב-HAVING בדוגמה הזו.
#legacySQL SELECT repository.url FROM [bigquery-public-data:samples.github_nested] OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
פסוקית GROUP BY
הסעיף GROUP BY מאפשר לקבץ שורות עם אותם ערכים בשדה נתון או בקבוצת שדות, כדי שתוכלו לחשב צבירות של שדות קשורים. הקיבוץ מתבצע אחרי הסינון שמוגדר בסעיף WHERE, אבל לפני שהמערכת מחשבת את הביטויים בסעיף SELECT. אי אפשר להשתמש בתוצאות הביטוי כמפתחות של קבוצות בסעיף GROUP BY.
דוגמה
השאילתה הזו מוצאת את המילים הראשונות הנפוצות ביותר מתוך עשרת המילים הראשונות במערך הנתונים לדוגמה של טריגרמות.
בנוסף להדגמת השימוש בסעיף GROUP BY, מוצג בסרטון איך אפשר להשתמש באינדקסים מיקומיים במקום בשמות שדות בסעיפים GROUP BY ו-ORDER BY.
#legacySQL SELECT first, COUNT(ngram) FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 ORDER BY 2 DESC LIMIT 10;
צבירה שמבוצעת באמצעות פסקה GROUP BY נקראת צבירה מקובצת
. בניגוד לצבירה בהיקף מוגדר, צבירה מקובצת נפוצה ברוב מערכות העיבוד של SQL.
הערך המקדם EACH
המשנה EACH הוא רמז שאומר ל-BigQuery להפעיל את GROUP BY
באמצעות כמה מחיצות. האפשרות הזו שימושית במיוחד כשאתם יודעים שמערך הנתונים מכיל מספר גדול של ערכים נפרדים למפתחות הקבוצה.
EACH בעבר עודדנו שימוש בשיטה הזו במקרים רבים, אבל זה כבר לא המצב.
בדרך כלל, שימוש ב-GROUP BY בלי משנה EACH מניב ביצועים טובים יותר.
משתמשים ב-GROUP EACH BY כשהשאילתה נכשלה ומופיעה הודעת שגיאה על חריגה ממגבלות המשאבים.
הפונקציה ROLLUP
כשמשתמשים בפונקציה ROLLUP, BigQuery מוסיף שורות נוספות לתוצאת השאילתה שמייצגות צבירות מצומצמות. כל השדות שמופיעים אחרי ROLLUP צריכים להיות מוקפים בזוג סוגריים אחד. בשורה שנוספה בגלל הפונקציה ROLLUP, הערך NULL מציין את העמודות שבהן הסיכום מפורט.
דוגמה
השאילתה הזו יוצרת ספירות שנתיות של לידות של תינוקות ממין זכר ונקבה ממערך הנתונים לדוגמה של לידות.
#legacySQL SELECT year, is_male, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
אלה התוצאות של השאילתה. שימו לב שיש שורות שבהן אחד ממפתחות הקבוצה או שניהם הם NULL. השורות האלה הן שורות הסיכום.
+------+---------+----------+ | year | is_male | count | +------+---------+----------+ | NULL | NULL | 12122730 | | 2000 | NULL | 4063823 | | 2000 | false | 1984255 | | 2000 | true | 2079568 | | 2001 | NULL | 4031531 | | 2001 | false | 1970770 | | 2001 | true | 2060761 | | 2002 | NULL | 4027376 | | 2002 | false | 1966519 | | 2002 | true | 2060857 | +------+---------+----------+
כשמשתמשים בפונקציה ROLLUP, אפשר להשתמש בפונקציה GROUPING כדי להבחין בין שורות שנוספו בגלל הפונקציה ROLLUP לבין שורות שיש להן בפועל ערך NULL למפתח הקבוצה.
דוגמה
השאילתה הזו מוסיפה את הפונקציה GROUPING לדוגמה הקודמת כדי לזהות טוב יותר את השורות שנוספו בגלל הפונקציה ROLLUP.
#legacySQL SELECT year, GROUPING(year) as rollup_year, is_male, GROUPING(is_male) as rollup_gender, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
אלה התוצאות שהשאילתה החדשה מחזירה.
+------+-------------+---------+---------------+----------+ | year | rollup_year | is_male | rollup_gender | count | +------+-------------+---------+---------------+----------+ | NULL | 1 | NULL | 1 | 12122730 | | 2000 | 0 | NULL | 1 | 4063823 | | 2000 | 0 | false | 0 | 1984255 | | 2000 | 0 | true | 0 | 2079568 | | 2001 | 0 | NULL | 1 | 4031531 | | 2001 | 0 | false | 0 | 1970770 | | 2001 | 0 | true | 0 | 2060761 | | 2002 | 0 | NULL | 1 | 4027376 | | 2002 | 0 | false | 0 | 1966519 | | 2002 | 0 | true | 0 | 2060857 | +------+-------------+---------+---------------+----------+
הערות:
-
שדות לא מצטברים בסעיף
SELECTחייבים להופיע בסעיףGROUP BY.#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
-
אי אפשר להשתמש בביטויים שמחושבים בסעיף
SELECTבסעיףGROUP BYהמתאים.#legacySQL SELECT word, corpus, COUNT(word) word_count FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus, word_count; /* Fails because word_count is not visible to this
GROUP BYclause. */ - אין תמיכה בקיבוץ לפי ערכי float ו-double, כי פונקציית השוויון עבור הסוגים האלה לא מוגדרת היטב.
-
מכיוון שהמערכת אינטראקטיבית, יכול להיות ששאילתות שמפיקות מספר גדול של קבוצות ייכשלו. יכול להיות ששימוש
TOPבפונקציהTOPבמקום ב-GROUP BYיפתור בעיות מסוימות שקשורות לשינוי גודל.
סעיף HAVING
התנהגות הסעיף HAVING זהה להתנהגות הסעיף WHERE, אלא שהוא מוערך אחרי הסעיף SELECT, כך שהתוצאות של כל הביטויים המחושבים גלויות לסעיף HAVING. המשפט HAVING יכול להתייחס רק לפלטים של המשפט SELECT המתאים.
דוגמה
השאילתה הזו מחשבת את המילים הראשונות הנפוצות ביותר במערך הנתונים לדוגמה של n-גרמות שמכילות את האות a ומופיעות לכל היותר 10,000 פעמים.
#legacySQL SELECT first, COUNT(ngram) ngram_count FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 HAVING first contains "a" AND ngram_count < 10000 ORDER BY 2 DESC LIMIT 10;
פסוקית ORDER BY
הפסקה ORDER BY ממיינת את תוצאות השאילתה בסדר עולה או יורד באמצעות שדה מפתח אחד או יותר. כדי למיין לפי כמה שדות או כינויים, מזינים אותם כרשימה מופרדת בפסיקים. התוצאות ממוינות לפי השדות, בסדר שבו הם מופיעים.
משתמשים בסימן DESC (יורד) או בסימן ASC (עולה) כדי לציין את כיוון המיון.
ברירת המחדל היא ASC. אפשר לציין כיוון מיון שונה לכל מפתח מיון.
התנאי ORDER BY מוערך אחרי התנאי SELECT, כך שהוא יכול להפנות לפלט של כל ביטוי שמחושב בתנאי SELECT. אם שדה מקבל כינוי בסעיף SELECT, חובה להשתמש בכינוי בסעיף ORDER BY.
סעיף הגבלה
הסעיף LIMIT מגביל את מספר השורות בקבוצת התוצאות שמוחזרת. מכיוון ששאילתות ב-BigQuery פועלות בדרך כלל על מספרים גדולים מאוד של שורות, LIMIT היא דרך טובה להימנע משאילתות שפועלות במשך זמן רב, כי היא מאפשרת לעבד רק קבוצת משנה של השורות.
הערות:
-
הסעיף
LIMITיפסיק את העיבוד ויחזיר תוצאות כשהוא יעמוד בדרישות שלכם. הפעולה הזו יכולה לקצר את זמן העיבוד של חלק מהשאילתות, אבל כשמציינים פונקציות מצטברות כמו COUNT או משפטיORDER BY, עדיין צריך לעבד את כל מערך התוצאות לפני שמחזירים תוצאות. הפסקהLIMITהיא האחרונה שנבדקת. -
שאילתה עם פסקה
LIMITעדיין יכולה להיות לא דטרמיניסטית אם אין בשאילתה אופרטור שמבטיח את הסדר של קבוצת התוצאות של הפלט. הסיבה לכך היא ש-BigQuery מבצע את הפעולות באמצעות מספר גדול של עובדים מקבילים. אין ערובה לכך שהמשימות המקבילות יחזרו באותו סדר. -
הפסקה
LIMITלא יכולה להכיל פונקציות, היא מקבלת רק קבוע מספרי. -
כשמשתמשים בסעיף
LIMIT, יכול להיות הבדל בין סך הבייטים שעברו עיבוד לבין הבייטים שחויבו עבור אותה שאילתה.
תחביר של שאילתות
הסעיפים השונים של הצהרות SELECT ב-BigQuery מתוארים בפירוט למעלה. כאן מוצגת הדקדוק המלא של SELECT
הצהרות בפורמט קומפקטי עם קישורים חזרה לקטעים הספציפיים.
query: SELECT { * | field_path.* | expression } [ [ AS ] alias ] [ , ... ] [ FROM from_body [ WHERE bool_expression ] [ OMIT RECORD IF bool_expression] [ GROUP [ EACH ] BY [ ROLLUP ] { field_name_or_alias } [ , ... ] ] [ HAVING bool_expression ] [ ORDER BY field_name_or_alias [ { DESC | ASC } ] [, ... ] ] [ LIMIT n ] ]; from_body: { from_item [, ...] | # Warning: Comma means UNION ALL here from_item [ join_type ] JOIN [ EACH ] from_item [ ON join_predicate ] | (FLATTEN({ table_name | (query) }, field_name_or_alias)) | table_wildcard_function } from_item: { table_name | (query) } [ [ AS ] alias ] join_type: { INNER | [ FULL ] [ OUTER ] | RIGHT [ OUTER ] | LEFT [ OUTER ] | CROSS } join_predicate: field_from_one_side_of_the_join = field_from_the_other_side_of_the_join [ AND ...] expression: { literal_value | field_name_or_alias | function_call } bool_expression: { expression_which_results_in_a_boolean_value | bool_expression AND bool_expression | bool_expression OR bool_expression | NOT bool_expression }
הערה:
- סוגריים מרובעים [ ] מציינים פסוקיות אופציונליות.
- סוגריים מסולסלים { } תוחמים קבוצת אפשרויות.
- הקו האנכי '|' מציין OR לוגי.
- פסיק או מילת מפתח שאחריהם מופיעות שלוש נקודות בתוך סוגריים מרובעים [, … ] מציינים שאפשר לחזור על הפריט הקודם ברשימה עם המפריד שצוין.
- הסוגריים ( ) מציינים סוגריים מילוליים.
הפונקציות והאופרטורים שנתמכים
רוב סעיפי ההצהרה של SELECT תומכים בפונקציות. אין צורך לפרט שדות שמופיעים בהפניה לפונקציה באף SELECTclause. לכן, השאילתה הבאה תקינה, למרות שהשדה clicks לא מוצג ישירות:
#legacySQL SELECT country, SUM(clicks) FROM table GROUP BY country;
| פונקציות צבירה | |
|---|---|
AVG() |
הפונקציה מחזירה את הממוצע של הערכים בקבוצת שורות ... |
BIT_AND() |
מחזירה את התוצאה של פעולת AND ברמת הסיביות ... |
BIT_OR() |
מחזירה את התוצאה של פעולת OR ברמת הסיביות ... |
BIT_XOR() |
הפונקציה מחזירה את התוצאה של פעולת XOR ברמת הביטים ... |
CORR() |
הפונקציה מחזירה את מקדם המתאם של פירסון עבור קבוצה של זוגות מספרים. |
COUNT() |
מחזירה את המספר הכולל של הערכים ... |
COUNT([DISTINCT]) |
הפונקציה מחזירה את המספר הכולל של ערכים שאינם NULL ... |
COVAR_POP() |
מחשבת את השונות המשותפת של האוכלוסייה של הערכים ... |
COVAR_SAMP() |
מחשבת את השונות המשותפת המדגמית של הערכים ... |
EXACT_COUNT_DISTINCT() |
הפונקציה מחזירה את המספר המדויק של ערכים שונים שאינם NULL בשדה שצוין. |
FIRST() |
הפונקציה מחזירה את הערך הרציף הראשון בהיקף הפונקציה. |
GROUP_CONCAT() |
הפונקציה משרשרת כמה מחרוזות למחרוזת אחת ... |
GROUP_CONCAT_UNQUOTED() |
משרשרת כמה מחרוזות למחרוזת אחת ... לא מוסיפה מירכאות כפולות ... |
LAST() |
הפונקציה מחזירה את הערך האחרון ברצף ... |
MAX() |
הפונקציה מחזירה את הערך המקסימלי ... |
MIN() |
הפונקציה מחזירה את הערך המינימלי ... |
NEST() |
מצטברת את כל הערכים בהיקף הצבירה הנוכחי לשדה חוזר. |
NTH() |
מחזירה את הערך הרציף ה-n ... |
QUANTILES() |
מחשבת את הערכים המינימליים, המקסימליים והכמותיים המשוערים ... |
STDDEV() |
הפונקציה מחזירה את סטיית התקן ... |
STDDEV_POP() |
מחשבת את סטיית התקן של האוכלוסייה ... |
STDDEV_SAMP() |
מחשבת את סטיית התקן של המדגם ... |
SUM() |
הפונקציה מחזירה את הסכום הכולל של הערכים ... |
TOP() ... COUNT(*) |
הפונקציה מחזירה את max_records הרשומות העליונות לפי תדירות. |
UNIQUE() |
הפונקציה מחזירה את קבוצת הערכים הייחודיים שאינם NULL ... |
VARIANCE() |
מחשבת את השונות של הערכים ... |
VAR_POP() |
מחשבת את שונות האוכלוסייה של הערכים ... |
VAR_SAMP() |
מחשבת את השונות של המדגם של הערכים ... |
| אופרטורים אריתמטיים | |
|---|---|
+ |
הוספה |
- |
חיסור |
* |
כפל |
/ |
חטיבה |
% |
מודולו |
| פונקציות לביצוע פעולות ברמת הביטים | |
|---|---|
& |
ערך AND ברמת הביטים |
| |
ערך OR ברמת הביטים |
^ |
ערך XOR ברמת הביטים |
<< |
הזזה שמאלה ברמת הביטים |
>> |
הזזה בינארית ימינה |
~ |
NOT ברמת הביטים |
BIT_COUNT() |
הפונקציה מחזירה את מספר הביטים ... |
| פונקציות Cast | |
|---|---|
BOOLEAN() |
המרת הערך לערך בוליאני. |
BYTES() |
המרת הערך לבייטים. |
CAST(expr AS type) |
הפונקציה ממירה את expr למשתנה מסוג type. |
FLOAT() |
הפעלת Cast למסך מפוצל. |
HEX_STRING() |
המרת הערך למחרוזת הקסדצימלית. |
INTEGER() |
המרת הערך למספר שלם. |
STRING() |
המרת הערך למחרוזת. |
| פונקציות השוואה | |
|---|---|
expr1 = expr2 |
הפונקציה מחזירה את הערך true אם הביטויים שווים. |
expr1 != expr2expr1 <> expr2
|
הפונקציה מחזירה את הערך true אם הביטויים לא שווים. |
expr1 > expr2 |
הפונקציה מחזירה true אם expr1 גדול מ-expr2. |
expr1 < expr2 |
הפונקציה מחזירה true אם expr1 קטן מ-expr2. |
expr1 >= expr2 |
הפונקציה מחזירה true אם expr1 גדול מ-expr2 או שווה לו. |
expr1 <= expr2 |
הפונקציה מחזירה true אם expr1 קטן מ-expr2 או שווה לו. |
expr1 BETWEEN expr2 AND expr3 |
הפונקציה מחזירה true אם הערך של expr1
הוא בין expr2 ל-expr3, כולל. |
expr IS NULL |
הפונקציה מחזירה true אם expr הוא NULL. |
expr IN() |
הפונקציה מחזירה true אם expr תואם ל-expr1, ל-expr2 או לכל ערך אחר בסוגריים. |
COALESCE() |
הפונקציה מחזירה את הארגומנט הראשון שאינו NULL. |
GREATEST() |
הפונקציה מחזירה את הפרמטר numeric_expr הגדול ביותר. |
IFNULL() |
אם הארגומנט הוא לא null, הפונקציה מחזירה את הארגומנט. |
IS_INF() |
הפונקציה מחזירה true אם הערך הוא אינסוף חיובי או שלילי. |
IS_NAN() |
הפונקציה מחזירה true אם הארגומנט הוא NaN. |
IS_EXPLICITLY_DEFINED() |
הוצא משימוש: במקומו צריך להשתמש ב-expr IS NOT NULL. |
LEAST() |
הפונקציה מחזירה את הארגומנט הקטן ביותר numeric_expr פרמטר. |
NVL() |
אם expr הוא לא null, הפונקציה מחזירה את expr, אחרת היא מחזירה את null_default. |
| פונקציות של תאריך ושעה | |
|---|---|
CURRENT_DATE() |
הפונקציה מחזירה את התאריך הנוכחי בפורמט %Y-%m-%d. |
CURRENT_TIME() |
הפונקציה מחזירה את השעה הנוכחית של השרת בפורמט %H:%M:%S. |
CURRENT_TIMESTAMP() |
הפונקציה מחזירה את השעה הנוכחית של השרת בפורמט %Y-%m-%d %H:%M:%S. |
DATE() |
הפונקציה מחזירה את התאריך בפורמט %Y-%m-%d. |
DATE_ADD() |
מוסיפה את המרווח שצוין לסוג הנתונים TIMESTAMP. |
DATEDIFF() |
הפונקציה מחזירה את מספר הימים בין שני ערכים מסוג TIMESTAMP. |
DAY() |
הפונקציה מחזירה את היום בחודש כמספר שלם בין 1 ל-31. |
DAYOFWEEK() |
הפונקציה מחזירה את היום בשבוע כמספר שלם בין 1 (יום ראשון) ל-7 (יום שבת). |
DAYOFYEAR() |
הפונקציה מחזירה את היום בשנה כמספר שלם בין 1 ל-366. |
FORMAT_UTC_USEC() |
הפונקציה מחזירה חותמת זמן של מערכת UNIX בפורמט YYYY-MM-DD HH:MM:SS.uuuuuu. |
HOUR() |
הפונקציה מחזירה את השעה של חותמת זמן כמספר שלם בין 0 ל-23. |
MINUTE() |
הפונקציה מחזירה את הדקות של חותמת זמן כמספר שלם בין 0 ל-59. |
MONTH() |
הפונקציה מחזירה את החודש של חותמת זמן כמספר שלם בין 1 ל-12. |
MSEC_TO_TIMESTAMP() |
הפונקציה ממירה חותמת זמן של מערכת UNIX באלפיות השנייה לחותמת זמן. |
NOW() |
הפונקציה מחזירה את חותמת הזמן הנוכחית של מערכת UNIX במיקרו-שניות. |
PARSE_UTC_USEC() |
ממירה מחרוזת תאריך לחותמת זמן במיקרו-שניות לפי ראשית זמן יוניקס (Unix epoch). |
QUARTER() |
הפונקציה מחזירה את הרבעון בשנה של חותמת זמן כמספר שלם בין 1 ל-4. |
SEC_TO_TIMESTAMP() |
ממירה חותמת זמן של מערכת UNIX בשניות לחותמת זמן. |
SECOND() |
הפונקציה מחזירה את השניות של חותמת זמן כמספר שלם בין 0 ל-59. |
STRFTIME_UTC_USEC() |
מחזירה מחרוזת תאריך בפורמט date_format_str. |
TIME() |
מחזירה חותמת זמן בפורמט %H:%M:%S. |
TIMESTAMP() |
הפונקציה ממירה מחרוזת תאריך לערך מסוג TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
הפונקציה ממירה חותמת זמן לחותמת זמן של מערכת Unix באלפיות השנייה. |
TIMESTAMP_TO_SEC() |
ממירה חותמת זמן לחותמת זמן של מערכת UNIX בשניות. |
TIMESTAMP_TO_USEC() |
הפונקציה ממירה חותמת זמן לחותמת זמן של מערכת UNIX במיקרו-שניות. |
USEC_TO_TIMESTAMP() |
הפונקציה ממירה חותמת זמן של מערכת UNIX במיקרו-שניות לחותמת זמן. |
UTC_USEC_TO_DAY() |
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת היום שבו היא מתרחשת. |
UTC_USEC_TO_HOUR() |
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת השעה שבה היא מתרחשת. |
UTC_USEC_TO_MONTH() |
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת החודש שבו היא מתרחשת. |
UTC_USEC_TO_WEEK() |
הפונקציה מחזירה חותמת זמן של מערכת UNIX במיקרו-שניות שמייצגת יום בשבוע. |
UTC_USEC_TO_YEAR() |
הפונקציה מחזירה חותמת זמן של מערכת Unix במיקרו-שניות שמייצגת את השנה. |
WEEK() |
הפונקציה מחזירה את השבוע של חותמת זמן כמספר שלם בין 1 ל-53. |
YEAR() |
הפונקציה מחזירה את השנה של חותמת זמן. |
| פונקציות IP | |
|---|---|
FORMAT_IP() |
הפונקציה ממירה את 32 הביטים הכי פחות משמעותיים של integer_value למחרוזת של כתובת IPv4 שקריאה לבני אדם. |
PARSE_IP() |
ממירה מחרוזת שמייצגת כתובת IPv4 לערך של מספר שלם לא מסומן. |
FORMAT_PACKED_IP() |
הפונקציה מחזירה כתובת IP בפורמט קריא (לבני אדם) בצורה
10.1.5.23 או 2620:0:1009:1:216:36ff:feef:3f. |
PARSE_PACKED_IP() |
הפונקציה מחזירה כתובת IP בפורמט BYTES. |
| פונקציות JSON | |
|---|---|
JSON_EXTRACT() |
הפונקציה בוחרת ערך בהתאם לביטוי JSONPath ומחזירה מחרוזת JSON. |
JSON_EXTRACT_SCALAR() |
הפונקציה בוחרת ערך לפי ביטוי JSONPath ומחזירה סקלר JSON. |
| אופרטורים לוגיים | |
|---|---|
expr AND expr |
הפונקציה מחזירה את הערך true אם שני הביטויים נכונים. |
expr OR expr |
הפונקציה מחזירה את הערך true אם אחד מהביטויים או שניהם נכונים. |
NOT expr |
הפונקציה מחזירה את הערך true אם הביטוי שקרי. |
| פונקציות מתמטיות | |
|---|---|
ABS() |
הפונקציה מחזירה את הערך המוחלט של הארגומנט. |
ACOS() |
הפונקציה מחזירה את ארק קוסינוס של הארגומנט. |
ACOSH() |
מחזירה את ההופכי של הקוסינוס ההיפרבולי של הארגומנט. |
ASIN() |
הפונקציה מחזירה את ארקסינוס של הארגומנט. |
ASINH() |
הפונקציה מחזירה את היפוך הסינוס ההיפרבולי של הארגומנט. |
ATAN() |
הפונקציה מחזירה את ארק טנגנס של הארגומנט. |
ATANH() |
מחזירה את היפוך הטנגנס ההיפרבולי של הארגומנט. |
ATAN2() |
מחזירה את פונקציית הטנגנס ההפוכה של שני הארגומנטים. |
CEIL() |
הפונקציה מעגלת את הארגומנט כלפי מעלה למספר השלם הקרוב ביותר ומחזירה את הערך המעוגל. |
COS() |
הפונקציה מחזירה את הקוסינוס של הארגומנט. |
COSH() |
מחזירה את הקוסינוס ההיפרבולי של הארגומנט. |
DEGREES() |
ממירה מרדיאנים למעלות. |
EXP() |
מחזירה את e בחזקת הארגומנט. |
FLOOR() |
מעגלת את הארגומנט כלפי מטה למספר השלם הקרוב ביותר. |
LN()LOG()
|
הפונקציה מחזירה את הלוגריתם הטבעי של הארגומנט. |
LOG2() |
הפונקציה מחזירה את הלוגריתם של הארגומנט לפי בסיס 2. |
LOG10() |
מחזירה את הלוגריתם של הארגומנט לפי בסיס 10. |
PI() |
הפונקציה מחזירה את הקבוע π. |
POW() |
הפונקציה מחזירה את הארגומנט הראשון בחזקת הארגומנט השני. |
RADIANS() |
ממירה ממעלות לרדיאנים. |
RAND() |
מחזירה ערך אקראי של מספר ממשי בטווח 0.0 <= value < 1.0. |
ROUND() |
מעגלת את הארגומנט כלפי מעלה או מטה למספר השלם הקרוב ביותר. |
SIN() |
הפונקציה מחזירה את הסינוס של הארגומנט. |
SINH() |
הפונקציה מחזירה את הסינוס ההיפרבולי של הארגומנט. |
SQRT() |
הפונקציה מחזירה את השורש הריבועי של הביטוי. |
TAN() |
מחזירה את הטנגנס של הארגומנט. |
TANH() |
הפונקציה מחזירה את הטנגנס ההיפרבולי של הארגומנט. |
| פונקציות של ביטויים רגולריים | |
|---|---|
REGEXP_MATCH() |
הפונקציה מחזירה את הערך True אם הארגומנט תואם לביטוי הרגולרי. |
REGEXP_EXTRACT() |
הפונקציה מחזירה את החלק של הארגומנט שתואם לקבוצת הלכידה בביטוי הרגולרי. |
REGEXP_REPLACE() |
מחליפה תת-מחרוזת שתואמת לביטוי רגולרי. |
| פונקציות מחרוזת | |
|---|---|
CONCAT() |
הפונקציה מחזירה את השרשור של שתי מחרוזות או יותר, או NULL אם אחד מהערכים הוא NULL. |
expr CONTAINS 'str' |
הפונקציה מחזירה true אם expr מכיל את ארגומנט המחרוזת שצוין. |
INSTR() |
הפונקציה מחזירה את האינדקס מבוסס-1 של המופע הראשון של מחרוזת. |
LEFT() |
הפונקציה מחזירה את התווים הימניים ביותר של מחרוזת. |
LENGTH() |
הפונקציה מחזירה את אורך המחרוזת. |
LOWER() |
הפונקציה מחזירה את המחרוזת המקורית עם כל התווים באותיות קטנות. |
LPAD() |
הפונקציה מוסיפה תווים משמאל למחרוזת. |
LTRIM() |
הפונקציה מסירה תווים מהצד השמאלי של מחרוזת. |
REPLACE() |
הפונקציה מחליפה את כל המופעים של מחרוזת משנה. |
RIGHT() |
הפונקציה מחזירה את התווים הכי שמאליים במחרוזת. |
RPAD() |
הפונקציה מוסיפה תווים לצד ימין של מחרוזת. |
RTRIM() |
מסירה תווים מסוף המחרוזת. |
SPLIT() |
מפצלת מחרוזת למחרוזות משנה חוזרות. |
SUBSTR() |
הפונקציה מחזירה מחרוזת משנה ... |
UPPER() |
הפונקציה מחזירה את המחרוזת המקורית עם כל התווים באותיות גדולות. |
| פונקציות של תווים כלליים לחיפוש בטבלאות | |
|---|---|
TABLE_DATE_RANGE() |
השאילתה מופעלת על כמה טבלאות יומיות שמתפרסות על פני טווח תאריכים. |
TABLE_DATE_RANGE_STRICT() |
השאילתות מורצות על כמה טבלאות יומיות בטווח תאריכים, ללא תאריכים חסרים. |
TABLE_QUERY() |
שאילתות בטבלאות שהשמות שלהן תואמים לפרדיקט שצוין. |
| פונקציות של כתובות URL | |
|---|---|
HOST() |
בהינתן כתובת URL, הפונקציה מחזירה את שם המארח כמחרוזת. |
DOMAIN() |
בהינתן כתובת URL, הפונקציה מחזירה את הדומיין כמחרוזת. |
TLD() |
בהינתן כתובת URL, הפונקציה מחזירה את הדומיין ברמה העליונה בתוספת דומיין של מדינה כלשהי בכתובת ה-URL. |
| פונקציות חלון | |
|---|---|
AVG()COUNT(*)COUNT([DISTINCT])MAX()MIN()STDDEV()SUM() |
אותה פעולה כמו פונקציות הצבירה המתאימות, אבל החישוב מתבצע על חלון שמוגדר על ידי פסוקית OVER. |
CUME_DIST() |
מחזירה ערך כפול שמציין את ההתפלגות המצטברת של ערך בקבוצת ערכים ... |
DENSE_RANK() |
הפונקציה מחזירה את הדירוג של ערך בקבוצת ערכים כמספר שלם. |
FIRST_VALUE() |
הפונקציה מחזירה את הערך הראשון של השדה שצוין בחלון. |
LAG() |
הפונקציה מאפשרת לקרוא נתונים משורה קודמת בחלון. |
LAST_VALUE() |
הפונקציה מחזירה את הערך האחרון של השדה שצוין בחלון. |
LEAD() |
מאפשר לקרוא נתונים משורה הבאה בחלון. |
NTH_VALUE() |
הפונקציה מחזירה את הערך של <expr> במיקום
<n> של מסגרת החלון ...
|
NTILE() |
מחלקת את החלון למספר הדליים שצוין. |
PERCENT_RANK() |
הפונקציה מחזירה את הדירוג של השורה הנוכחית ביחס לשאר השורות במחיצה. |
PERCENTILE_CONT() |
הפונקציה מחזירה ערך משוער שמתאים לארגומנט של האחוזון ביחס לחלון ... |
PERCENTILE_DISC() |
הפונקציה מחזירה את הערך הקרוב ביותר לאחוזון של הארגומנט בחלון. |
RANK() |
הפונקציה מחזירה את הדירוג של ערך בקבוצת ערכים כמספר שלם. |
RATIO_TO_REPORT() |
הפונקציה מחזירה את היחס של כל ערך לסכום הערכים. |
ROW_NUMBER() |
הפונקציה מחזירה את מספר השורה הנוכחי של תוצאת השאילתה בחלון. |
| פונקציות אחרות | |
|---|---|
CASE WHEN ... THEN |
אפשר להשתמש ב-CASE כדי לבחור בין שני ביטויים חלופיים או יותר בשאילתה. |
CURRENT_USER() |
הפונקציה מחזירה את כתובת האימייל של המשתמש שמריץ את השאילתה. |
EVERY() |
הפונקציה מחזירה את הערך True אם הארגומנט נכון לכל ערכי הקלט שלו. |
FROM_BASE64() |
ממירה את מחרוזת הקלט שמקודדת ב-Base64 לפורמט BYTES. |
HASH() |
הפונקציה מחשבת ומחזירה ערך גיבוב (hash) עם סימן בן 64 ביט ... |
FARM_FINGERPRINT() |
הפונקציה מחשבת ומחזירה ערך טביעת אצבע עם סימן בן 64 ביט ... |
IF() |
אם הארגומנט הראשון הוא true, מחזירה את הארגומנט השני. אחרת, מחזירה את הארגומנט השלישי. |
POSITION() |
הפונקציה מחזירה את המיקום הרציף של הארגומנט, החל מ-1. |
SHA1() |
מחזירה גיבוב SHA1 בפורמט BYTES. |
SOME() |
הפונקציה מחזירה את הערך True אם הארגומנט נכון לפחות לאחד מערכי הקלט שלו. |
TO_BASE64() |
הפונקציה ממירה את הארגומנט BYTES למחרוזת בקידוד Base64. |
פונקציות צבירה
פונקציות מצטברות מחזירות ערכים שמייצגים סיכומים של מערכי נתונים גדולים יותר, ולכן הן שימושיות במיוחד לניתוח יומנים. פונקציה מצטברת פועלת על אוסף של ערכים ומחזירה ערך יחיד לכל טבלה, קבוצה או היקף:
- צבירת נתונים בטבלה
משתמש בפונקציית צבירה כדי לסכם את כל השורות שעומדות בדרישות בטבלה. לדוגמה:
SELECT COUNT(f1) FROM ds.Table; - צבירה של נתונים ברמת הקבוצה
משתמשת בפונקציית צבירה ובסעיף
GROUP BYשמציין שדה לא מצטבר כדי לסכם שורות לפי קבוצה. לדוגמה:SELECT COUNT(f1) FROM ds.Table GROUP BY b1;הפונקציה TOP מייצגת מקרה מיוחד של צבירת נתונים בקבוצה.
- צבירת נתונים בהיקף מוגדר
התכונה הזו רלוונטית רק לטבלאות עם שדות מקוננים.
משתמשת בפונקציית צבירה ובמילת המפתחWITHINכדי לצבור ערכים חוזרים בהיקף מוגדר. לדוגמה:SELECT COUNT(m1.f2) WITHIN RECORD FROM Table;ההיקף יכול להיות
RECORD, שמתאים לשורה שלמה, או צומת (שדה שחוזר על עצמו בשורה). פונקציות צבירה פועלות על הערכים בתוך ההיקף ומחזירות תוצאות צבירה לכל רשומה או צומת.
אפשר להחיל הגבלה על פונקציית צבירה באמצעות אחת מהאפשרויות הבאות:
-
כינוי בשאילתת בחירה משנית. ההגבלה מצוינת בסעיף
WHEREהחיצוני.#legacySQL SELECT corpus, count_corpus_words FROM (SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus) AS sub_shakespeare WHERE count_corpus_words > 4000
-
כינוי במשפט HAVING.
#legacySQL SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus HAVING count_corpus_words > 4000;
אפשר גם להפנות לכתובת חלופית בסעיפים GROUP BY או ORDER BY.
תחביר
| פונקציות צבירה | |
|---|---|
AVG() |
הפונקציה מחזירה את הממוצע של הערכים בקבוצת שורות ... |
BIT_AND() |
מחזירה את התוצאה של פעולת AND ברמת הסיביות ... |
BIT_OR() |
מחזירה את התוצאה של פעולת OR ברמת הסיביות ... |
BIT_XOR() |
הפונקציה מחזירה את התוצאה של פעולת XOR ברמת הביטים ... |
CORR() |
הפונקציה מחזירה את מקדם המתאם של פירסון עבור קבוצה של זוגות מספרים. |
COUNT() |
מחזירה את המספר הכולל של הערכים ... |
COUNT([DISTINCT]) |
הפונקציה מחזירה את המספר הכולל של ערכים שאינם NULL ... |
COVAR_POP() |
מחשבת את השונות המשותפת של האוכלוסייה של הערכים ... |
COVAR_SAMP() |
מחשבת את השונות המשותפת המדגמית של הערכים ... |
EXACT_COUNT_DISTINCT() |
הפונקציה מחזירה את המספר המדויק של ערכים שונים שאינם NULL בשדה שצוין. |
FIRST() |
הפונקציה מחזירה את הערך הרציף הראשון בהיקף הפונקציה. |
GROUP_CONCAT() |
הפונקציה משרשרת כמה מחרוזות למחרוזת אחת ... |
GROUP_CONCAT_UNQUOTED() |
משרשרת כמה מחרוזות למחרוזת אחת ... לא מוסיפה מירכאות כפולות ... |
LAST() |
הפונקציה מחזירה את הערך האחרון ברצף ... |
MAX() |
הפונקציה מחזירה את הערך המקסימלי ... |
MIN() |
הפונקציה מחזירה את הערך המינימלי ... |
NEST() |
מצטברת את כל הערכים בהיקף הצבירה הנוכחי לשדה חוזר. |
NTH() |
מחזירה את הערך הרציף ה-n ... |
QUANTILES() |
מחשבת את הערכים המינימליים, המקסימליים והכמותיים המשוערים ... |
STDDEV() |
הפונקציה מחזירה את סטיית התקן ... |
STDDEV_POP() |
מחשבת את סטיית התקן של האוכלוסייה ... |
STDDEV_SAMP() |
מחשבת את סטיית התקן של המדגם ... |
SUM() |
הפונקציה מחזירה את הסכום הכולל של הערכים ... |
TOP() ... COUNT(*) |
הפונקציה מחזירה את max_records הרשומות העליונות לפי תדירות. |
UNIQUE() |
הפונקציה מחזירה את קבוצת הערכים הייחודיים שאינם NULL ... |
VARIANCE() |
מחשבת את השונות של הערכים ... |
VAR_POP() |
מחשבת את שונות האוכלוסייה של הערכים ... |
VAR_SAMP() |
מחשבת את השונות של המדגם של הערכים ... |
AVG(numeric_expr)
- מחזירה את הממוצע של הערכים לקבוצת שורות שחושב על ידי
numeric_expr. שורות עם ערך NULL לא נכללות בחישוב. BIT_AND(numeric_expr)- הפונקציה מחזירה את התוצאה של פעולת
ANDברמת הסיביות בין כל מופע שלnumeric_exprבכל השורות. המערכת מתעלמת מהערכים שלNULL. הפונקציה הזו מחזירהNULLאם כל המופעים שלnumeric_exprמחזירים את הערךNULL. BIT_OR(numeric_expr)- הפונקציה מחזירה את התוצאה של פעולת
ORברמת הסיביות בין כל מופע שלnumeric_exprבכל השורות. המערכת מתעלמת מהערכים שלNULL. הפונקציה הזו מחזירהNULLאם כל המופעים שלnumeric_exprמחזירים את הערךNULL. BIT_XOR(numeric_expr)- הפונקציה מחזירה את התוצאה של פעולת
XORברמת הסיביות בין כל מופע שלnumeric_exprבכל השורות. המערכת מתעלמת מהערכים שלNULL. הפונקציה הזו מחזירהNULLאם כל המופעים שלnumeric_exprמחזירים את הערךNULL. CORR(numeric_expr, numeric_expr)- הפונקציה מחזירה את מקדם המתאם של פירסון עבור קבוצה של זוגות מספרים.
COUNT(*)- הפונקציה מחזירה את המספר הכולל של הערכים (NULL ולא NULL) בתחום הפעולה של הפונקציה. אלא אם משתמשים ב-
COUNT(*)עם הפונקציהTOP, עדיף לציין במפורש את השדה שרוצים לספור. COUNT([DISTINCT] field [, n])- הפונקציה מחזירה את המספר הכולל של ערכים שאינם NULL בהיקף הפונקציה.
אם משתמשים במילת המפתח
DISTINCT, הפונקציה מחזירה את מספר הערכים השונים בשדה שצוין. חשוב לזכור שהערך שמוחזר עבורDISTINCTהוא קירוב סטטיסטי ולא מובטח שהוא יהיה מדויק.שימוש ב-
EXACT_COUNT_DISTINCT()לקבלת תשובה מדויקת.אם אתם צריכים רמת דיוק גבוהה יותר מ-
, אתם יכולים לציין פרמטר שני,COUNT(DISTINCT)n, שקובע את ערך הסף שמתחתיו מובטח שתקבלו תוצאות מדויקות. ערך ברירת המחדל שלnהוא 1, 000, אבל אם תגדירו ערך גדול יותר ל-n, תקבלו תוצאות מדויקות ל-COUNT(DISTINCT)עד לערך הזה שלn. עם זאת, אם תתנו ערכים גדולים יותר שלn, יכולת ההתאמה של האופרטור הזה תצטמצם, וזמן הביצוע של השאילתה עלול להתארך משמעותית או שהשאילתה עלולה להיכשל.כדי לחשב את המספר המדויק של ערכים ייחודיים, משתמשים בפונקציה EXACT_COUNT_DISTINCT. לחלופין, כדי להשתמש בגישה שניתנת להרחבה, כדאי להשתמש ב-
GROUP EACH BYבשדות הרלוונטיים ואז להחיל אתCOUNT(*). הגישה שלGROUP EACH BYניתנת להרחבה יותר, אבל יכול להיות שהיא תגרום לירידה קלה בביצועים בשלב הראשוני. COVAR_POP(numeric_expr1, numeric_expr2)- מחשבת את השונות המשותפת של האוכלוסייה של הערכים שמחושבים על ידי
numeric_expr1ו-numeric_expr2. COVAR_SAMP(numeric_expr1, numeric_expr2)
- מחשבת את השונות המשותפת המדגמית של הערכים שמחושבים על ידי
numeric_expr1ו-numeric_expr2. EXACT_COUNT_DISTINCT(field)- מחזירה את המספר המדויק של ערכים שונים שאינם NULL בשדה שצוין. כדי לשפר את יכולת ההתאמה לשינויים ואת הביצועים, כדאי להשתמש בפונקציה COUNT(DISTINCT field).
FIRST(expr)
- מחזירה את הערך הרציף הראשון בהיקף הפונקציה.
GROUP_CONCAT('str' [, separator])-
הפונקציה משרשרת כמה מחרוזות למחרוזת אחת, שבה כל ערך מופרד באמצעות הפרמטר האופציונלי
separator. אם משמיטים אתseparator, BigQuery מחזיר מחרוזת מופרדת בפסיקים.אם מחרוזת בנתוני המקור מכילה תו מירכאות כפולות, הפונקציה
GROUP_CONCATמחזירה את המחרוזת עם מירכאות כפולות שנוספו. לדוגמה, המחרוזתa"bתחזיר את הערך"a""b". משתמשים ב-GROUP_CONCAT_UNQUOTEDאם רוצים שהמחרוזות האלה לא יוחזרו עם מירכאות.לדוגמה:
#legacySQL SELECT GROUP_CONCAT(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
GROUP_CONCAT_UNQUOTED('str' [, separator])-
הפונקציה משרשרת כמה מחרוזות למחרוזת אחת, שבה כל ערך מופרד באמצעות הפרמטר האופציונלי
separator. אם משמיטים אתseparator, BigQuery מחזיר מחרוזת מופרדת בפסיקים.שלא כמו הפונקציה
GROUP_CONCAT, הפונקציה הזו לא מוסיפה מירכאות כפולות לערכים שמוחזרים וכוללים תו מירכאות כפולות. לדוגמה, המחרוזתa"bתחזיר את הערךa"b.לדוגמה:
#legacySQL SELECT GROUP_CONCAT_UNQUOTED(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
LAST(field)- הפונקציה מחזירה את הערך האחרון ברצף בתחום הפונקציה.
MAX(field)
- מחזירה את הערך המקסימלי בהיקף הפונקציה.
MIN(field)
- Returns the minimum value in the scope of the function.
NEST(expr)-
מצטברת את כל הערכים בהיקף הצבירה הנוכחי לשדה חוזר. לדוגמה, השאילתה
"SELECT x, NEST(y) FROM ... GROUP BY x"מחזירה רשומת פלט אחת לכל ערך שונה שלx, והיא מכילה שדה חוזר לכל הערכים שלyשמשויכים ל-xבקלט של השאילתה. הפונקציהNESTדורשת פסקה שלGROUP BY.מערכת BigQuery משטחת אוטומטית את תוצאות השאילתה, כך שאם משתמשים בפונקציה
NESTבשאילתה ברמה העליונה, התוצאות לא יכללו שדות חוזרים. משתמשים בפונקציהNESTכשמשתמשים בשאילתת משנה שמפיקה תוצאות ביניים לשימוש מיידי באותה שאילתה. NTH(n, field)
- מחזירה את הערך הרציף ה-
nבתחום הפונקציה, כאשרnהוא קבוע. הפונקציהNTHמתחילה את הספירה ב-1, ולכן אין איבר אפס. אם בהיקף הפונקציה יש פחות מ-nערכים, הפונקציה מחזירהNULL. QUANTILES(expr[, buckets])-
הפונקציה מחשבת את המינימום, המקסימום והכמויות המשוערים של ביטוי הקלט. המערכת מתעלמת מערכי הקלט של
NULL. קלט ריק או קלט שמורכב רק מ-NULLיניב פלט שלNULL. מספר הכמויות שחושבו נקבע באמצעות הפרמטר האופציונליbuckets, שכולל את המינימום והמקסימום בספירה. כדי לחשב אחוזונים משוערים, משתמשים ב-N+1buckets. ערך ברירת המחדל שלbucketsהוא 100. (הערה: ערך ברירת המחדל 100 לא מייצג אחוזונים. כדי להעריך אחוזונים, צריך להשתמש ב-101bucketsלפחות). אם מציינים אתbucketsבאופן מפורש, הערך שלו חייב להיות לפחות 2.השגיאה החלקית לכל קוונטיל היא אפסילון = 1 /
buckets, כלומר השגיאה קטנה ככל שמספר הדליים גדל. לדוגמה:QUANTILES(<expr>, 2) # computes min and max with 50% error. QUANTILES(<expr>, 3) # computes min, median, and max with 33% error. QUANTILES(<expr>, 5) # computes quartiles with 25% error. QUANTILES(<expr>, 11) # computes deciles with 10% error. QUANTILES(<expr>, 21) # computes vigintiles with 5% error. QUANTILES(<expr>, 101) # computes percentiles with 1% error.
אפשר להשתמש בפונקציה
NTHכדי לבחור קוונטיל מסוים, אבל חשוב לזכור שהפונקציהNTHמבוססת על 1, ושהפונקציהQUANTILESמחזירה את המינימום (הקוונטיל ה-0) במיקום הראשון, ואת המקסימום (האחוזון ה-100 או ה-N-tile ה-N) במיקום האחרון. לדוגמה, הפונקציהNTH(11, QUANTILES(expr, 21))מעריכה את החציון שלexpr, ואילו הפונקציהNTH(20, QUANTILES(expr, 21))מעריכה את ה-19 שלexpr(האחוזון ה-95). שני האומדנים כוללים שולי שגיאה של 5%.כדי לשפר את הדיוק, כדאי להשתמש ביותר קטגוריות. לדוגמה, כדי להקטין את שולי השגיאה של החישובים הקודמים מ-5% ל-0.1%, צריך להשתמש ב-1,001 קטגוריות במקום ב-21, ולשנות את הארגומנט בהתאם בפונקציה
NTH. כדי לחשב את החציון עם שגיאה של 0.1%, משתמשים בפונקציהNTH(501, QUANTILES(expr, 1001)). כדי לחשב את האחוזון ה-95 עם שגיאה של 0.1%, משתמשים בפונקציהNTH(951, QUANTILES(expr, 1001)). STDDEV(numeric_expr)
- מחזירה את סטיית התקן של הערכים שמחושבים על ידי
numeric_expr. שורות עם ערך NULL לא נכללות בחישוב. הפונקציהSTDDEVהיא כינוי שלSTDDEV_SAMP. STDDEV_POP(numeric_expr)
- מחשבת את סטיית התקן של האוכלוסייה של הערך שמחושב על ידי
numeric_expr. משתמשים בפונקציהSTDDEV_POP()כדי לחשב את סטיית התקן של מערך נתונים שמקיף את כל האוכלוסייה הרלוונטית. אם מערך הנתונים כולל רק מדגם מייצג של האוכלוסייה, צריך להשתמש ב-STDDEV_SAMP(). מידע נוסף על סטיית תקן של אוכלוסייה לעומת סטיית תקן של מדגם זמין במאמר סטיית תקן בוויקיפדיה. STDDEV_SAMP(numeric_expr)
הפונקציה - מחשבת את סטיית התקן של מדגם הערך שמחושב על ידי
numeric_expr. כדי לחשב את סטיית התקן של אוכלוסייה שלמה על סמך מדגם מייצג של האוכלוסייה, משתמשים בפונקציהSTDDEV_SAMP(). אם מערך הנתונים כולל את כל האוכלוסייה, צריך להשתמש בפונקציהSTDDEV_POP()במקום זאת. מידע נוסף על סטיית תקן של אוכלוסייה לעומת סטיית תקן של מדגם זמין במאמר סטיית תקן בוויקיפדיה. SUM(field)- הפונקציה מחזירה את הסכום הכולל של הערכים בהיקף הפונקציה. לשימוש עם סוגי נתונים מספריים בלבד.
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
- מחזירה את max_records הרשומות העליונות לפי תדירות. פרטים נוספים מופיעים בתיאור שלמעלה.
UNIQUE(expr)- הפונקציה מחזירה את קבוצת הערכים הייחודיים שאינם NULL בתחום הפונקציה, בסדר לא מוגדר. בדומה לסעיף גדול של
GROUP BYבלי מילת המפתחEACH, השאילתה תיכשל עם השגיאה 'חריגה ממגבלות המשאבים' אם יש יותר מדי ערכים שונים. עם זאת, בניגוד לפונקציהGROUP BY, אפשר להחיל את הפונקציהUNIQUEעם צבירה בהיקף מוגבל, וכך לבצע פעולות יעילות בשדות מקוננים עם מספר מוגבל של ערכים. VARIANCE(numeric_expr)
- Computes the variance of the values computed by
numeric_expr. שורות עם ערך NULL לא נכללות בחישוב. הפונקציהVARIANCEהיא כינוי של הפונקציהVAR_SAMP. VAR_POP(numeric_expr)
- מחשבת את השונות של האוכלוסייה של הערכים שמחושבים על ידי
numeric_expr. מידע נוסף על סטיית תקן של אוכלוסייה לעומת סטיית תקן של מדגם זמין במאמר סטיית תקן בוויקיפדיה. VAR_SAMP(numeric_expr)
- Computes the sample variance of the values computed by
numeric_expr. מידע נוסף על סטיית תקן של אוכלוסייה לעומת סטיית תקן של מדגם זמין במאמר סטיית תקן בוויקיפדיה.
הפונקציה TOP()
TOP היא פונקציה שמשמשת כחלופה לפונקציה GROUP BY. היא משמשת כתחביר פשוט יותר ל-GROUP BY ... ORDER BY ... LIMIT .... בדרך כלל, הפונקציה TOP פועלת מהר יותר מהשאילתה המלאה ... GROUP BY ... ORDER BY ... LIMIT ..., אבל היא עשויה להחזיר רק תוצאות משוערות. התחביר של הפונקציה TOP הוא:
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
כשמשתמשים ב-TOP בסעיף SELECT, צריך לכלול את COUNT(*) כאחד מהשדות.
שאילתה שמשתמשת בפונקציה TOP() יכולה להחזיר רק שני שדות: השדה TOP והערך של COUNT(*).
field|alias
- השדה או הכינוי שיוחזרו.
max_values
- [אופציונלי] המספר המקסימלי של תוצאות להחזרה. ברירת המחדל היא 20.
multiplier- מספר שלם חיובי שמגדיל את הערכים שמוחזרים על ידי
COUNT(*)בכפולה שצוינה.
דוגמאות לשימוש בפונקציה TOP()
-
דוגמאות לשאילתות בסיסיות שמשתמשות ב-
TOP()השאילתות הבאות משתמשות ב-
TOP()כדי להחזיר 10 שורות.דוגמה 1:
#legacySQL SELECT TOP(word, 10) as word, COUNT(*) as cnt FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th";
דוגמה 2:
#legacySQL SELECT word, left(word, 3) FROM (SELECT TOP(word, 10) AS word, COUNT(*) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th");
-
השוואה בין
TOP()לביןGROUP BY...ORDER BY...LIMITהשאילתה מחזירה, לפי הסדר, את 10 המילים הנפוצות ביותר שמכילות את הצירוף 'th', ואת מספר המסמכים שבהם נעשה שימוש במילים האלה. השאילתה
TOPתפעל הרבה יותר מהר:דוגמה בלי
TOP():#legacySQL SELECT word, COUNT(*) AS cnt FROM ds.Table WHERE word CONTAINS 'th' GROUP BY word ORDER BY cnt DESC LIMIT 10;
דוגמה עם
TOP():#legacySQL SELECT TOP(word, 10), COUNT(*) FROM ds.Table WHERE word contains 'th';
-
שימוש בפרמטר
multiplier.השאילתות הבאות מראות איך הפרמטר
multiplierמשפיע על תוצאת השאילתה. השאילתה הראשונה מחזירה את מספר הלידות בחודש בויומינג. בשילתה השנייה נעשה שימוש בפרמטרmultiplierכדי להכפיל את הערכים שלcntב-100.דוגמה בלי הפרמטר
multiplier:#legacySQL SELECT TOP(month,3) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
החזרות:
+-------+-------+ | month | cnt | +-------+-------+ | 7 | 19594 | | 5 | 19038 | | 8 | 19030 | +-------+-------+
דוגמה עם הפרמטר
multiplier:#legacySQL SELECT TOP(month,3,100) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
החזרות:
+-------+---------+ | month | cnt | +-------+---------+ | 7 | 1959400 | | 5 | 1903800 | | 8 | 1903000 | +-------+---------+
הערה: כדי להשתמש ב-TOP, צריך לכלול את COUNT(*) בסעיף SELECT.
דוגמאות מתקדמות
-
ממוצע וסטיית תקן מקובצים לפי מצב
השאילתה הבאה מחזירה את הממוצע ואת סטיית התקן של משקלי הלידה באוהיו בשנת 2003, מקובצים לפי אמהות שמעשנות ואמהות שלא מעשנות.
לדוגמה:
#legacySQL SELECT cigarette_use, /* Finds average and standard deviation */ AVG(weight_pounds) baby_weight, STDDEV(weight_pounds) baby_weight_stdev, AVG(mother_age) mother_age FROM [bigquery-public-data:samples.natality] WHERE year=2003 AND state='OH' /* Group the result values by those */ /* who smoked and those who didn't. */ GROUP BY cigarette_use;
-
סינון תוצאות של שאילתות באמצעות ערך מצטבר
כדי לסנן את תוצאות השאילתה באמצעות ערך מצטבר (לדוגמה, סינון לפי הערך של
SUM), צריך להשתמש בפונקציהHAVING. הפונקציהHAVINGמשווה ערך לתוצאה שנקבעת על ידי פונקציית צבירה, בניגוד לפונקציהWHERE, שפועלת על כל שורה לפני הצבירה.לדוגמה:
#legacySQL SELECT state, /* If 'is_male' is True, return 'Male', */ /* otherwise return 'Female' */ IF (is_male, 'Male', 'Female') AS sex, /* The count value is aliased as 'cnt' */ /* and used in the HAVING clause below. */ COUNT(*) AS cnt FROM [bigquery-public-data:samples.natality] WHERE state != '' GROUP BY state, sex HAVING cnt > 3000000 ORDER BY cnt DESC
החזרות:
+-------+--------+---------+ | state | sex | cnt | +-------+--------+---------+ | CA | Male | 7060826 | | CA | Female | 6733288 | | TX | Male | 5107542 | | TX | Female | 4879247 | | NY | Male | 4442246 | | NY | Female | 4227891 | | IL | Male | 3089555 | +-------+--------+---------+
אופרטורים אריתמטיים
אופרטורים אריתמטיים מקבלים ארגומנטים מספריים ומחזירים תוצאה מספרית. כל ארגומנט יכול להיות מספר מילולי או ערך מספרי שמוחזר על ידי שאילתה. אם הפעולה האריתמטית מחזירה תוצאה לא מוגדרת, הפעולה מחזירה NULL.
תחביר
| אופרטור | תיאור | דוגמה |
|---|---|---|
| + | הוספה |
החזרות: 10 |
| - | חיסור |
החזרות: 1 |
| * | כפל |
החזרות: 24 |
| / | חטיבה |
החזרה: 1.5 |
| % | מודולו |
החזרות: 2 |
פונקציות לביצוע פעולות ברמת הביטים
פונקציות ברמת הסיביות פועלות ברמה של סיביות בודדות ודורשות ארגומנטים מספריים. מידע נוסף על פונקציות של פעולות ברמת הביט זמין במאמר בנושא פעולות ברמת הביט.
שלוש פונקציות נוספות לביצוע פעולות ברמת הביטים, BIT_AND, BIT_OR ו-BIT_XOR, מתועדות בפונקציות מצטברות.
תחביר
| אופרטור | תיאור | דוגמה |
|---|---|---|
| & | ערך AND ברמת הביטים |
החזרות: 0 |
| | | ערך OR ברמת הביטים |
החזרות: 28 |
| ^ | ערך XOR ברמת הסיביות |
החזרות: 1 |
| << | הזזה שמאלה ברמת הביטים |
החזרות: 16 |
| >> | הזזה בינארית ימינה |
החזרות: 2 |
| ~ | NOT ברמת הביטים |
החזרות: -3 |
BIT_COUNT(<numeric_expr>) |
הפונקציה מחזירה את מספר הביטים שמוגדרים ב- |
החזרות: 4 |
פונקציות Cast
פונקציות המרה משנות את סוג הנתונים של ביטוי מספרי. פונקציות המרה שימושיות במיוחד כדי לוודא שלארגומנטים בפונקציית השוואה יש את אותו סוג נתונים.
תחביר
| פונקציות Cast | |
|---|---|
BOOLEAN() |
המרת הערך לערך בוליאני. |
BYTES() |
המרת הערך לבייטים. |
CAST(expr AS type) |
הפונקציה ממירה את expr למשתנה מסוג type. |
FLOAT() |
הפעלת Cast למסך מפוצל. |
HEX_STRING() |
המרת הערך למחרוזת הקסדצימלית. |
INTEGER() |
המרת הערך למספר שלם. |
STRING() |
המרת הערך למחרוזת. |
BOOLEAN(<numeric_expr>)-
- הפונקציה מחזירה את הערך
trueאם<numeric_expr>לא שווה ל-0 ולא ל-NULL. - הפונקציה מחזירה
falseאם<numeric_expr>הוא 0. - הפונקציה מחזירה
NULLאם<numeric_expr>הוא NULL.
- הפונקציה מחזירה את הערך
BYTES(string_expr)
- Returns
string_expras a value of typebytes. CAST(expr AS type)
- Converts
exprinto a variable of typetype. FLOAT(expr)-
הפונקציה מחזירה את הערך
exprכמספר כפול. הפרמטרexprיכול להיות מחרוזת כמו'45.78', אבל הפונקציה מחזירהNULLעבור ערכים לא מספריים. HEX_STRING(numeric_expr)- מחזירה את הערך
numeric_exprכמחרוזת הקסדצימלית. INTEGER(expr)-
מבצע המרה של
exprלמספר שלם ב-64 ביט.- הפונקציה מחזירה NULL אם
exprהיא מחרוזת שלא תואמת לערך של מספר שלם. - הפונקציה מחזירה את מספר המיקרו-שניות מאז תקופת ה-Unix אם
exprהוא חותמת זמן.
- הפונקציה מחזירה NULL אם
STRING(numeric_expr)- מחזירה את
numeric_exprכמחרוזת.
פונקציות השוואה
פונקציות השוואה מחזירות true או false, על סמך סוגי ההשוואות הבאים:
- השוואה בין שני ביטויים.
- השוואה של ביטוי או קבוצת ביטויים לקריטריון ספציפי, כמו הימצאות ברשימה מסוימת, היות הערך NULL או היות הערך אופציונלי ולא ברירת מחדל.
חלק מהפונקציות שמפורטות בהמשך מחזירות ערכים שונים מ-true או מ-false, אבל הערכים שהן מחזירות מבוססים על פעולות השוואה.
אפשר להשתמש בביטויים מספריים או בביטויי מחרוזת כארגומנטים לפונקציות השוואה. (קבועי מחרוזות צריכים להיות מוקפים במירכאות יחידות או כפולות). הביטויים יכולים להיות ערכים מילוליים או ערכים שאוחזרו על ידי שאילתה. לרוב משתמשים בפונקציות השוואה כתנאי סינון בסעיפי WHERE, אבל אפשר להשתמש בהן גם בסעיפים אחרים.
תחביר
| פונקציות השוואה | |
|---|---|
expr1 = expr2 |
הפונקציה מחזירה את הערך true אם הביטויים שווים. |
expr1 != expr2expr1 <> expr2
|
הפונקציה מחזירה את הערך true אם הביטויים לא שווים. |
expr1 > expr2 |
הפונקציה מחזירה true אם expr1 גדול מ-expr2. |
expr1 < expr2 |
הפונקציה מחזירה true אם expr1 קטן מ-expr2. |
expr1 >= expr2 |
הפונקציה מחזירה true אם expr1 גדול מ-expr2 או שווה לו. |
expr1 <= expr2 |
הפונקציה מחזירה true אם expr1 קטן מ-expr2 או שווה לו. |
expr1 BETWEEN expr2 AND expr3 |
הפונקציה מחזירה true אם הערך של expr1
הוא בין expr2 ל-expr3, כולל. |
expr IS NULL |
הפונקציה מחזירה true אם expr הוא NULL. |
expr IN() |
הפונקציה מחזירה true אם expr תואם ל-expr1, ל-expr2 או לכל ערך אחר בסוגריים. |
COALESCE() |
הפונקציה מחזירה את הארגומנט הראשון שאינו NULL. |
GREATEST() |
הפונקציה מחזירה את הפרמטר numeric_expr הגדול ביותר. |
IFNULL() |
אם הארגומנט הוא לא null, הפונקציה מחזירה את הארגומנט. |
IS_INF() |
הפונקציה מחזירה true אם הערך הוא אינסוף חיובי או שלילי. |
IS_NAN() |
הפונקציה מחזירה true אם הארגומנט הוא NaN. |
IS_EXPLICITLY_DEFINED() |
הוצא משימוש: במקומו צריך להשתמש ב-expr IS NOT NULL. |
LEAST() |
הפונקציה מחזירה את הארגומנט הקטן ביותר numeric_expr פרמטר. |
NVL() |
אם expr הוא לא null, הפונקציה מחזירה את expr, אחרת היא מחזירה את null_default. |
expr1 = expr2- הפונקציה מחזירה את הערך
trueאם הביטויים שווים. expr1 != expr2
expr1 <> expr2
- מחזירה
trueאם הביטויים לא שווים. expr1 > expr2
- Returns
trueifexpr1is greater thanexpr2. expr1 < expr2
- מחזירה
trueאםexpr1קטן מ-expr2. expr1 >= expr2
- מחזירה
trueאםexpr1גדול מ-expr2או שווה לו. expr1 <= expr2- מחזירה
trueאםexpr1קטן מ-expr2או שווה לו. expr1 BETWEEN expr2 AND expr3-
הפונקציה מחזירה
trueאם הערך שלexpr1גדול מ-expr2או שווה לו, וקטן מ-expr3או שווה לו. expr IS NULL
- מחזירה
trueאםexprהוא NULL. expr IN(expr1, expr2, ...)
- מחזירה
trueאםexprתואם ל-expr1, ל-expr2או לכל ערך בסוגריים. מילת המפתחINהיא קיצור יעיל ל-(expr = expr1 || expr = expr2 || ...). הביטויים שמשמשים עם מילת המפתחINחייבים להיות קבועים, והם צריכים להתאים לסוג הנתונים שלexpr. אפשר להשתמש בסעיףINגם כדי ליצור הצטרפויות חלקיות והצטרפויות הפוכות. מידע נוסף זמין במאמר Semi-join ו-Anti-join. COALESCE(<expr1>, <expr2>, ...)- מחזירה את הארגומנט הראשון שאינו NULL.
GREATEST(numeric_expr1, numeric_expr2, ...)-
הפונקציה מחזירה את הפרמטר
numeric_exprהגדול ביותר. כל הפרמטרים חייבים להיות מספריים, וכולם חייבים להיות מאותו סוג. אם פרמטר כלשהו הואNULL, הפונקציה הזו מחזירהNULL.כדי להתעלם מערכים של
NULL, משתמשים בפונקציהIFNULLכדי לשנות את הערכים שלNULLלערך שלא משפיע על ההשוואה. בדוגמת הקוד הבאה, הפונקציהIFNULLמשמשת לשינוי ערכים שלNULLל--1, מה שלא משפיע על ההשוואה בין מספרים חיוביים.SELECT GREATEST(IFNULL(a,-1), IFNULL(b,-1)) FROM (SELECT 1 as a, NULL as b);
IFNULL(expr, null_default)
- If
expris not null, returnsexpr, otherwise returnsnull_default. IS_INF(numeric_expr)
- Returns
trueifnumeric_expris positive or negative infinity. IS_NAN(numeric_expr)
הפונקציה - מחזירה את הערך
trueאםnumeric_exprהוא הערך המספרי המיוחדNaN. IS_EXPLICITLY_DEFINED(expr)-
הפונקציה הזו הוצאה משימוש. במקום זאת, אתם צריכים להשתמש ב-
expr IS NOT NULL. LEAST(numeric_expr1, numeric_expr2, ...)-
הפונקציה מחזירה את הפרמטר הקטן ביותר
numeric_expr. כל הפרמטרים חייבים להיות מספריים, וכולם חייבים להיות מאותו סוג. אם פרמטר כלשהו הואNULL, הפונקציה הזו מחזירהNULL NVL(expr, null_default)
- If
expris not null, returnsexpr, otherwise returnsnull_default. הפונקציהNVLהיא כינוי של הפונקציהIFNULL.
פונקציות של תאריך ושעה
הפונקציות הבאות מאפשרות לבצע מניפולציות על תאריכים ושעות בחותמות זמן של UNIX, במחרוזות של תאריכים ובסוגי נתונים של חותמות זמן. למידע נוסף על עבודה עם סוג הנתונים TIMESTAMP, אפשר לעיין במאמר שימוש ב-TIMESTAMP.
פונקציות של תאריך ושעה שפועלות עם חותמות זמן של UNIX פועלות על זמן UNIX. פונקציות של תאריך ושעה מחזירות ערכים על סמך אזור הזמן UTC.
תחביר
| פונקציות של תאריך ושעה | |
|---|---|
CURRENT_DATE() |
הפונקציה מחזירה את התאריך הנוכחי בפורמט %Y-%m-%d. |
CURRENT_TIME() |
הפונקציה מחזירה את השעה הנוכחית של השרת בפורמט %H:%M:%S. |
CURRENT_TIMESTAMP() |
הפונקציה מחזירה את השעה הנוכחית של השרת בפורמט %Y-%m-%d %H:%M:%S. |
DATE() |
הפונקציה מחזירה את התאריך בפורמט %Y-%m-%d. |
DATE_ADD() |
מוסיפה את המרווח שצוין לסוג הנתונים TIMESTAMP. |
DATEDIFF() |
הפונקציה מחזירה את מספר הימים בין שני ערכים מסוג TIMESTAMP. |
DAY() |
הפונקציה מחזירה את היום בחודש כמספר שלם בין 1 ל-31. |
DAYOFWEEK() |
הפונקציה מחזירה את היום בשבוע כמספר שלם בין 1 (יום ראשון) ל-7 (יום שבת). |
DAYOFYEAR() |
הפונקציה מחזירה את היום בשנה כמספר שלם בין 1 ל-366. |
FORMAT_UTC_USEC() |
הפונקציה מחזירה חותמת זמן של מערכת UNIX בפורמט YYYY-MM-DD HH:MM:SS.uuuuuu. |
HOUR() |
הפונקציה מחזירה את השעה של חותמת זמן כמספר שלם בין 0 ל-23. |
MINUTE() |
הפונקציה מחזירה את הדקות של חותמת זמן כמספר שלם בין 0 ל-59. |
MONTH() |
הפונקציה מחזירה את החודש של חותמת זמן כמספר שלם בין 1 ל-12. |
MSEC_TO_TIMESTAMP() |
הפונקציה ממירה חותמת זמן של מערכת UNIX באלפיות השנייה לחותמת זמן. |
NOW() |
הפונקציה מחזירה את חותמת הזמן הנוכחית של מערכת UNIX במיקרו-שניות. |
PARSE_UTC_USEC() |
ממירה מחרוזת תאריך לחותמת זמן במיקרו-שניות לפי ראשית זמן יוניקס (Unix epoch). |
QUARTER() |
הפונקציה מחזירה את הרבעון בשנה של חותמת זמן כמספר שלם בין 1 ל-4. |
SEC_TO_TIMESTAMP() |
ממירה חותמת זמן של מערכת UNIX בשניות לחותמת זמן. |
SECOND() |
הפונקציה מחזירה את השניות של חותמת זמן כמספר שלם בין 0 ל-59. |
STRFTIME_UTC_USEC() |
מחזירה מחרוזת תאריך בפורמט date_format_str. |
TIME() |
מחזירה חותמת זמן בפורמט %H:%M:%S. |
TIMESTAMP() |
הפונקציה ממירה מחרוזת תאריך לערך מסוג TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
הפונקציה ממירה חותמת זמן לחותמת זמן של מערכת Unix באלפיות השנייה. |
TIMESTAMP_TO_SEC() |
ממירה חותמת זמן לחותמת זמן של מערכת UNIX בשניות. |
TIMESTAMP_TO_USEC() |
הפונקציה ממירה חותמת זמן לחותמת זמן של מערכת UNIX במיקרו-שניות. |
USEC_TO_TIMESTAMP() |
הפונקציה ממירה חותמת זמן של מערכת UNIX במיקרו-שניות לחותמת זמן. |
UTC_USEC_TO_DAY() |
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת היום שבו היא מתרחשת. |
UTC_USEC_TO_HOUR() |
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת השעה שבה היא מתרחשת. |
UTC_USEC_TO_MONTH() |
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת החודש שבו היא מתרחשת. |
UTC_USEC_TO_WEEK() |
הפונקציה מחזירה חותמת זמן של מערכת UNIX במיקרו-שניות שמייצגת יום בשבוע. |
UTC_USEC_TO_YEAR() |
הפונקציה מחזירה חותמת זמן של מערכת Unix במיקרו-שניות שמייצגת את השנה. |
WEEK() |
הפונקציה מחזירה את השבוע של חותמת זמן כמספר שלם בין 1 ל-53. |
YEAR() |
הפונקציה מחזירה את השנה של חותמת זמן. |
CURRENT_DATE()הפונקציה מחזירה מחרוזת קריאה של התאריך הנוכחי בפורמט
%Y-%m-%d.לדוגמה:
SELECT CURRENT_DATE();הפונקציה מחזירה: 2013-02-01
CURRENT_TIME()הפונקציה מחזירה מחרוזת שניתנת לקריאה על ידי בני אדם של השעה הנוכחית בשרת בפורמט
%H:%M:%S.לדוגמה:
SELECT CURRENT_TIME();החזרה: 01:32:56
CURRENT_TIMESTAMP()מחזירה סוג נתונים של חותמת זמן של השעה הנוכחית בשרת בפורמט
%Y-%m-%d %H:%M:%S.לדוגמה:
SELECT CURRENT_TIMESTAMP();הפונקציה מחזירה: 2013-02-01 01:33:35 UTC
DATE(<timestamp>)מחזירה מחרוזת קריאה לאדם של סוג הנתונים TIMESTAMP בפורמט
%Y-%m-%d.לדוגמה:
SELECT DATE(TIMESTAMP('2012-10-01 02:03:04'));החזרה: 2012-10-01
DATE_ADD(<timestamp>,<interval>,
<interval_units>)מוסיפה את המרווח שצוין לסוג הנתונים TIMESTAMP. הערכים האפשריים של
interval_unitsכולליםYEAR,MONTH,DAY,HOUR,MINUTEו-SECOND. אםintervalהוא מספר שלילי, המרווח מופחת מטיפוס הנתונים TIMESTAMP.לדוגמה:
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR");הפונקציה מחזירה: 2017-10-01 02:03:04 UTC
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), -5, "YEAR");הפונקציה מחזירה: 2007-10-01 02:03:04 UTC
DATEDIFF(<timestamp1>,<timestamp2>)הפונקציה מחזירה את מספר הימים בין שני ערכים מסוג TIMESTAMP. התוצאה חיובית אם סוג הנתונים של חותמת הזמן הראשונה מופיע אחרי סוג הנתונים של חותמת הזמן השנייה, אחרת התוצאה שלילית.
לדוגמה:
SELECT DATEDIFF(TIMESTAMP('2012-10-02 05:23:48'), TIMESTAMP('2011-06-24 12:18:35'));החזרות: 466
לדוגמה:
SELECT DATEDIFF(TIMESTAMP('2011-06-24 12:18:35'), TIMESTAMP('2012-10-02 05:23:48'));החזרות: -466
DAY(<timestamp>)הפונקציה מחזירה את היום בחודש של סוג הנתונים TIMESTAMP כמספר שלם בין 1 ל-31, כולל.
לדוגמה:
SELECT DAY(TIMESTAMP('2012-10-02 05:23:48'));החזרות: 2
DAYOFWEEK(<timestamp>)הפונקציה מחזירה את היום בשבוע של סוג הנתונים TIMESTAMP כמספר שלם בין 1 (יום ראשון) ל-7 (יום שבת), כולל.
לדוגמה:
SELECT DAYOFWEEK(TIMESTAMP("2012-10-01 02:03:04"));החזרות: 2
DAYOFYEAR(<timestamp>)הפונקציה מחזירה את היום בשנה של סוג הנתונים TIMESTAMP כמספר שלם בין 1 ל-366, כולל. המספר השלם 1 מתייחס ל-1 בינואר.
לדוגמה:
SELECT DAYOFYEAR(TIMESTAMP("2012-10-01 02:03:04"));החזרות: 275
FORMAT_UTC_USEC(<unix_timestamp>)מחזירה ייצוג מחרוזת קריא של חותמת זמן בפורמט UNIX
YYYY-MM-DD HH:MM:SS.uuuuuu.לדוגמה:
SELECT FORMAT_UTC_USEC(1274259481071200);החזרה: 2010-05-19 08:58:01.071200
HOUR(<timestamp>)הפונקציה מחזירה את השעה של סוג הנתונים TIMESTAMP כמספר שלם בין 0 ל-23, כולל.
לדוגמה:
SELECT HOUR(TIMESTAMP('2012-10-02 05:23:48'));החזרות: 5
MINUTE(<timestamp>)הפונקציה מחזירה את הדקות של סוג הנתונים TIMESTAMP כמספר שלם בין 0 ל-59, כולל.
לדוגמה:
SELECT MINUTE(TIMESTAMP('2012-10-02 05:23:48'));החזרות: 23
MONTH(<timestamp>)הפונקציה מחזירה את החודש של סוג הנתונים TIMESTAMP כמספר שלם בין 1 ל-12, כולל.
לדוגמה:
SELECT MONTH(TIMESTAMP('2012-10-02 05:23:48'));החזרות: 10
MSEC_TO_TIMESTAMP(<expr>)
- ממירה חותמת זמן של UNIX באלפיות השנייה לסוג נתונים של חותמת זמן.
לדוגמה:
SELECT MSEC_TO_TIMESTAMP(1349053323000);הפונקציה מחזירה: 2012-10-01 01:02:03 UTC
SELECT MSEC_TO_TIMESTAMP(1349053323000 + 1000)הפונקציה מחזירה: 2012-10-01 01:02:04 UTC
NOW()הפונקציה מחזירה את חותמת הזמן הנוכחית של מערכת UNIX במיקרו-שניות.
לדוגמה:
SELECT NOW();החזרות: 1359685811687920
PARSE_UTC_USEC(<date_string>)-
ממירה מחרוזת תאריך לחותמת זמן במיקרו-שניות לפי ראשית זמן יוניקס (Unix epoch). הערך של
date_stringצריך להיות בפורמטYYYY-MM-DD HH:MM:SS[.uuuuuu]. החלק העשרוני של השנייה יכול להיות באורך של עד 6 ספרות, או שאפשר להשמיט אותו.הפונקציה TIMESTAMP_TO_USEC היא פונקציה מקבילה שממירה ארגומנט מסוג נתונים TIMESTAMP במקום מחרוזת תאריך.
לדוגמה:
SELECT PARSE_UTC_USEC("2012-10-01 02:03:04");הערך שמוחזר: 1349056984000000
QUARTER(<timestamp>)הפונקציה מחזירה את הרבעון בשנה של נתונים מסוג TIMESTAMP כמספר שלם בין 1 ל-4 (כולל).
לדוגמה:
SELECT QUARTER(TIMESTAMP("2012-10-01 02:03:04"));החזרות: 4
SEC_TO_TIMESTAMP(<expr>)הפונקציה ממירה חותמת זמן של מערכת UNIX בשניות לסוג נתונים של חותמת זמן.
לדוגמה:
SELECT SEC_TO_TIMESTAMP(1355968987);הפונקציה מחזירה: 2012-12-20 02:03:07 UTC
SELECT SEC_TO_TIMESTAMP(INTEGER(1355968984 + 3));הפונקציה מחזירה: 2012-12-20 02:03:07 UTC
SECOND(<timestamp>)-
הפונקציה מחזירה את השניות של סוג הנתונים TIMESTAMP כמספר שלם בין 0 ל-59, כולל.
במהלך שנייה מעוברת, טווח המספרים השלמים הוא בין 0 ל-60, כולל.
לדוגמה:
SELECT SECOND(TIMESTAMP('2012-10-02 05:23:48'));החזרות: 48
STRFTIME_UTC_USEC(<unix_timestamp>,
<date_format_str>)-
מחזירה מחרוזת תאריך שקריאה לאנשים בפורמט date_format_str. הארגומנט date_format_str יכול לכלול סימני פיסוק שקשורים לתאריך (כמו / ו--) ותווים מיוחדים שמקובלים על הפונקציה strftime ב-C++ (כמו %d לציון היום בחודש).
אם אתם מתכננים לקבץ את נתוני השאילתה לפי מרווחי זמן, למשל כדי לקבל את כל הנתונים של חודש מסוים, מומלץ להשתמש בפונקציות
UTC_USEC_TO_<function_name>כי הן יעילות יותר.לדוגמה:
SELECT STRFTIME_UTC_USEC(1274259481071200, "%Y-%m-%d");החזרה: 2010-05-19
TIME(<timestamp>)הפונקציה מחזירה מחרוזת קריאה לאנשים של סוג הנתונים TIMESTAMP, בפורמט
%H:%M:%S.לדוגמה:
SELECT TIME(TIMESTAMP('2012-10-01 02:03:04'));הפונקציה מחזירה: 02:03:04
TIMESTAMP(<date_string>)הפונקציה ממירה מחרוזת תאריך לסוג הנתונים TIMESTAMP.
לדוגמה:
SELECT TIMESTAMP("2012-10-01 01:02:03");הפונקציה מחזירה: 2012-10-01 01:02:03 UTC
TIMESTAMP_TO_MSEC(<timestamp>)הפונקציה ממירה סוג נתונים של חותמת זמן לחותמת זמן של מערכת Unix באלפיות השנייה.
לדוגמה:
SELECT TIMESTAMP_TO_MSEC(TIMESTAMP("2012-10-01 01:02:03"));הערך שמוחזר: 1349053323000
TIMESTAMP_TO_SEC(<timestamp>)
- ממירה סוג נתונים של חותמת זמן לחותמת זמן של UNIX בשניות.
לדוגמה:
SELECT TIMESTAMP_TO_SEC(TIMESTAMP("2012-10-01 01:02:03"));הערך שמוחזר: 1349053323
TIMESTAMP_TO_USEC(<timestamp>)-
הפונקציה ממירה סוג נתונים של חותמת זמן לחותמת זמן של UNIX במיקרו-שניות.
הפונקציה PARSE_UTC_USEC היא פונקציה מקבילה שממירה ארגומנט של מחרוזת נתונים במקום סוג נתונים של חותמת זמן.
לדוגמה:
SELECT TIMESTAMP_TO_USEC(TIMESTAMP("2012-10-01 01:02:03"));הערך שמוחזר: 1349053323000000
USEC_TO_TIMESTAMP(<expr>)ממירה חותמת זמן של מערכת UNIX במיקרו-שניות לסוג נתונים TIMESTAMP.
לדוגמה:
SELECT USEC_TO_TIMESTAMP(1349053323000000);הפונקציה מחזירה: 2012-10-01 01:02:03 UTC
SELECT USEC_TO_TIMESTAMP(1349053323000000 + 1000000)הפונקציה מחזירה: 2012-10-01 01:02:04 UTC
UTC_USEC_TO_DAY(<unix_timestamp>)-
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת היום שבו היא מתרחשת.
לדוגמה, אם
unix_timestampמתרחש ב-19 במאי בשעה 08:58, הפונקציה הזו מחזירה חותמת זמן של UNIX ל-19 במאי בשעה 00:00 (חצות).לדוגמה:
SELECT UTC_USEC_TO_DAY(1274259481071200);החזרות: 1274227200000000
UTC_USEC_TO_HOUR(<unix_timestamp>)-
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת השעה שבה היא מתרחשת.
לדוגמה, אם
unix_timestampמתרחש בשעה 08:58, הפונקציה הזו מחזירה חותמת זמן של מערכת Unix לשעה 08:00 באותו יום.לדוגמה:
SELECT UTC_USEC_TO_HOUR(1274259481071200);החזרות: 1274256000000000
UTC_USEC_TO_MONTH(<unix_timestamp>)-
הפונקציה מעבירה חותמת זמן של מערכת UNIX במיקרו-שניות לתחילת החודש שבו היא מתרחשת.
לדוגמה, אם התאריך
unix_timestampהוא 19 במרץ, הפונקציה הזו מחזירה חותמת זמן של UNIX ל-1 במרץ של אותה שנה.לדוגמה:
SELECT UTC_USEC_TO_MONTH(1274259481071200);החזרות: 1272672000000000
UTC_USEC_TO_WEEK(<unix_timestamp>,
<day_of_week>)-
הפונקציה מחזירה חותמת זמן של UNIX במיקרו-שניות שמייצגת יום בשבוע של הארגומנט
unix_timestamp. הפונקציה הזו מקבלת שני ארגומנטים: חותמת זמן בפורמט UNIX במיקרו-שניות, ויום בשבוע מ-0 (יום ראשון) עד 6 (יום שבת).לדוגמה, אם
unix_timestampמתרחש ביום שישי, 2008-04-11, ומגדירים אתday_of_weekל-2 (יום שלישי), הפונקציה מחזירה חותמת זמן של ראשית זמן יוניקס (Unix epoch) ליום שלישי, 2008-04-08.לדוגמה:
SELECT UTC_USEC_TO_WEEK(1207929480000000, 2) AS tuesday;החזרות: 1207612800000000
UTC_USEC_TO_YEAR(<unix_timestamp>)-
מחזירה חותמת זמן בפורמט UNIX במיקרו-שניות שמייצגת את השנה של הארגומנט
unix_timestamp.לדוגמה, אם
unix_timestampמתרחש בשנת 2010, הפונקציה מחזירה את הערך1274259481071200, שהוא ייצוג המיקרו-שנייה של2010-01-01 00:00.לדוגמה:
SELECT UTC_USEC_TO_YEAR(1274259481071200);הערך שמוחזר: 1262304000000000
WEEK(<timestamp>)הפונקציה מחזירה את השבוע של סוג הנתונים TIMESTAMP כמספר שלם בין 1 ל-53, כולל.
השבועות מתחילים ביום ראשון, ולכן אם ה-1 בינואר חל ביום אחר, שבוע 1 כולל פחות מ-7 ימים ויום ראשון הראשון בשנה הוא היום הראשון בשבוע 2.
לדוגמה:
SELECT WEEK(TIMESTAMP('2014-12-31'));החזרות: 53
YEAR(<timestamp>)- הפונקציה מחזירה את השנה של סוג הנתונים TIMESTAMP.
לדוגמה:
SELECT YEAR(TIMESTAMP('2012-10-02 05:23:48'));החזרות: 2012
דוגמאות מתקדמות
-
המרת תוצאות של חותמות זמן מסוג מספר שלם לפורמט קריא
השאילתה הבאה מוצאת את 5 הרגעים המובילים בזמן שבהם בוצעו הכי הרבה שינויים בוויקיפדיה. כדי להציג את התוצאות בפורמט שנוח לקריאה, משתמשים בפונקציה
FORMAT_UTC_USEC()של BigQuery, שמקבלת כקלט חותמת זמן במיקרו-שניות. בשאילתה הזו, חותמות הזמן בפורמט POSIX של ויקיפדיה (בשניות) מוכפלות ב-1,000,000 כדי להמיר את הערך למיקרו-שניות.לדוגמה:
#legacySQL SELECT /* Multiply timestamp by 1000000 and convert */ /* into a more human-readable format. */ TOP (FORMAT_UTC_USEC(timestamp * 1000000), 5) AS top_revision_time, COUNT (*) AS revision_count FROM [bigquery-public-data:samples.wikipedia];
החזרות:
+----------------------------+----------------+ | top_revision_time | revision_count | +----------------------------+----------------+ | 2002-02-25 15:51:15.000000 | 20976 | | 2002-02-25 15:43:11.000000 | 15974 | | 2010-02-02 03:34:51.000000 | 3 | | 2010-02-02 01:04:59.000000 | 3 | | 2010-02-01 23:55:05.000000 | 3 | +----------------------------+----------------+
-
חלוקת התוצאות לקבוצות לפי חותמת זמן
מומלץ להשתמש בפונקציות של תאריך ושעה כדי לקבץ את תוצאות השאילתה לדליים שמתאימים לשנים, לחודשים או לימים מסוימים. בדוגמה הבאה נעשה שימוש בפונקציה
UTC_USEC_TO_MONTH()כדי להציג כמה תווים כל תורם לוויקיפדיה משתמש בהערות שלו לשינוי בכל חודש.לדוגמה:
#legacySQL SELECT contributor_username, /* Return the timestamp shifted to the * start of the month, formatted in * a human-readable format. Uses the * 'LEFT()' string function to return only * the first 7 characters of the formatted timestamp. */ LEFT (FORMAT_UTC_USEC( UTC_USEC_TO_MONTH(timestamp * 1000000)),7) AS month, SUM(LENGTH(comment)) as total_chars_used FROM [bigquery-public-data:samples.wikipedia] WHERE (contributor_username != '' AND contributor_username IS NOT NULL) AND timestamp > 1133395200 AND timestamp < 1157068800 GROUP BY contributor_username, month ORDER BY total_chars_used DESC;
החזרות (חלק מהנתונים):
+--------------------------------+---------+-----------------------+ | contributor_username | month | total_chars_used | +--------------------------------+---------+-----------------------+ | Kingbotk | 2006-08 | 18015066 | | SmackBot | 2006-03 | 7838365 | | SmackBot | 2006-05 | 5148863 | | Tawkerbot2 | 2006-05 | 4434348 | | Cydebot | 2006-06 | 3380577 | etc ...
פונקציות IP
פונקציות IP ממירות כתובות IP לפורמט קריא (לבני אדם) וממירות מפורמט קריא לכתובות IP.
תחביר
| פונקציות IP | |
|---|---|
FORMAT_IP() |
הפונקציה ממירה את 32 הביטים הכי פחות משמעותיים של integer_value למחרוזת של כתובת IPv4 שקריאה לבני אדם. |
PARSE_IP() |
ממירה מחרוזת שמייצגת כתובת IPv4 לערך של מספר שלם לא מסומן. |
FORMAT_PACKED_IP() |
הפונקציה מחזירה כתובת IP בפורמט קריא (לבני אדם) בצורה
10.1.5.23 או 2620:0:1009:1:216:36ff:feef:3f. |
PARSE_PACKED_IP() |
הפונקציה מחזירה כתובת IP בפורמט BYTES. |
FORMAT_IP(integer_value)
- Converts 32 least significant bits of
integer_valueto human-readable IPv4 address string. לדוגמה, הפונקציהFORMAT_IP(1)תחזיר את המחרוזת'0.0.0.1'. PARSE_IP(readable_ip)
- ממירה מחרוזת שמייצגת כתובת IPv4 לערך של מספר שלם לא מסומן. לדוגמה, הפונקציה
PARSE_IP('0.0.0.1')תחזיר1. אם המחרוזת היא לא כתובת IPv4 תקינה, הפונקציהPARSE_IPתחזירNULL.
BigQuery תומך בכתיבת כתובות IPv4 ו-IPv6 במחרוזות ארוזות, כנתונים בינאריים של 4 או 16 בייט בסדר בתים ברשת. הפונקציות שמתוארות בהמשך תומכות בניתוח הכתובות לפורמט קריא (לבני אדם) וממנו. הפונקציות האלה פועלות רק בשדות מחרוזת עם כתובות IP.
תחביר
FORMAT_PACKED_IP(packed_ip)הפונקציה מחזירה כתובת IP שקלה לקריאה, בפורמט
10.1.5.23או2620:0:1009:1:216:36ff:feef:3f. דוגמאות:-
FORMAT_PACKED_IP('0123456789@ABCDE')החזרות'3031:3233:3435:3637:3839:4041:4243:4445' FORMAT_PACKED_IP('0123')החזרות'48.49.50.51'
-
PARSE_PACKED_IP(readable_ip)הפונקציה מחזירה כתובת IP בפורמט BYTES. אם מחרוזת הקלט היא לא כתובת IPv4 או IPv6 חוקית, הפונקציה
PARSE_PACKED_IPתחזירNULL. דוגמאות:PARSE_PACKED_IP('48.49.50.51')החזרות'MDEyMw=='PARSE_PACKED_IP('3031:3233:3435:3637:3839:4041:4243:4445')החזרות'MDEyMzQ1Njc4OUBBQkNERQ=='
פונקציות JSON
הפונקציות של JSON ב-BigQuery מאפשרות לכם למצוא ערכים בנתוני ה-JSON המאוחסנים, באמצעות ביטויים דמויי JSONPath.
אחסון נתוני JSON יכול להיות גמיש יותר מהצהרה על כל השדות הנפרדים בסכימת הטבלה, אבל הוא עלול להוביל לעלויות גבוהות יותר. כשבוחרים נתונים ממחרוזת JSON, מחויבים על סריקת המחרוזת כולה, וזה יקר יותר מאשר אם כל שדה נמצא בעמודה נפרדת. השאילתה גם איטית יותר כי צריך לנתח את המחרוזת כולה בזמן השאילתה. אבל אם מדובר בסכימות אד-הוק או בסכימות שמשתנות במהירות, הגמישות של JSON יכולה להיות שווה את העלות הנוספת.
אם אתם עובדים עם נתונים מובְנים, מומלץ להשתמש בפונקציות JSON במקום בפונקציות של ביטויים רגולריים ב-BigQuery, כי פונקציות JSON קלות יותר לשימוש.
תחביר
| פונקציות JSON | |
|---|---|
JSON_EXTRACT() |
הפונקציה בוחרת ערך בהתאם לביטוי JSONPath ומחזירה מחרוזת JSON. |
JSON_EXTRACT_SCALAR() |
הפונקציה בוחרת ערך לפי ביטוי JSONPath ומחזירה סקלר JSON. |
JSON_EXTRACT(json, json_path)-
בוחר ערך ב-
jsonבהתאם לביטוי JSONPathjson_path. הערךjson_pathחייב להיות קבוע מחרוזת. הפונקציה מחזירה את הערך בפורמט מחרוזת JSON. JSON_EXTRACT_SCALAR(json, json_path)-
בוחר ערך ב-
jsonבהתאם לביטוי JSONPathjson_path. הערךjson_pathחייב להיות קבוע מחרוזת. הפונקציה מחזירה ערך JSON סקלרי.
אופרטורים לוגיים
אופרטורים לוגיים מבצעים לוגיקה בינארית או טרנרית על ביטויים. הלוגיקה הבינארית מחזירה true או false. הלוגיקה התלת-ערכית כוללת NULL ערכים ומחזירה true, false או NULL.
תחביר
| אופרטורים לוגיים | |
|---|---|
expr AND expr |
הפונקציה מחזירה את הערך true אם שני הביטויים נכונים. |
expr OR expr |
הפונקציה מחזירה את הערך true אם אחד מהביטויים או שניהם נכונים. |
NOT expr |
הפונקציה מחזירה את הערך true אם הביטוי שקרי. |
expr AND expr- הפונקציה מחזירה את הערך
trueאם שני הביטויים נכונים. - הפונקציה מחזירה
falseאם אחד מהביטויים או שניהם הם false. - הפונקציה מחזירה את הערך
NULLאם שני הביטויים הם NULL או אם ביטוי אחד הוא true והשני הוא NULL.
- הפונקציה מחזירה את הערך
expr OR expr- הפונקציה מחזירה את הערך
trueאם אחד מהביטויים או שניהם נכונים. - הפונקציה מחזירה
falseאם שני הביטויים לא נכונים. - מחזירה
NULLאם שני הביטויים הם NULL או אם ביטוי אחד הוא false והשני הוא NULL.
- הפונקציה מחזירה את הערך
NOT expr- הפונקציה מחזירה את הערך
trueאם הביטוי שקרי. - הפונקציה מחזירה את הערך
falseאם הביטוי נכון. - הפונקציה מחזירה
NULLאם הביטוי הוא NULL.
אפשר להשתמש ב-
NOTעם פונקציות אחרות כאופרטור שלילה. לדוגמה,NOT IN(expr1, expr2)אוIS NOT NULL.- הפונקציה מחזירה את הערך
פונקציות מתמטיות
פונקציות מתמטיות מקבלות ארגומנטים מספריים ומחזירות תוצאה מספרית. כל ארגומנט יכול להיות מספר מילולי או ערך מספרי שמוחזר על ידי שאילתה. אם הפונקציה המתמטית מחזירה תוצאה לא מוגדרת, הפעולה מחזירה NULL.
תחביר
| פונקציות מתמטיות | |
|---|---|
ABS() |
הפונקציה מחזירה את הערך המוחלט של הארגומנט. |
ACOS() |
הפונקציה מחזירה את ארק קוסינוס של הארגומנט. |
ACOSH() |
מחזירה את ההופכי של הקוסינוס ההיפרבולי של הארגומנט. |
ASIN() |
הפונקציה מחזירה את ארקסינוס של הארגומנט. |
ASINH() |
הפונקציה מחזירה את היפוך הסינוס ההיפרבולי של הארגומנט. |
ATAN() |
הפונקציה מחזירה את ארק טנגנס של הארגומנט. |
ATANH() |
מחזירה את היפוך הטנגנס ההיפרבולי של הארגומנט. |
ATAN2() |
מחזירה את פונקציית הטנגנס ההפוכה של שני הארגומנטים. |
CEIL() |
הפונקציה מעגלת את הארגומנט כלפי מעלה למספר השלם הקרוב ביותר ומחזירה את הערך המעוגל. |
COS() |
הפונקציה מחזירה את הקוסינוס של הארגומנט. |
COSH() |
מחזירה את הקוסינוס ההיפרבולי של הארגומנט. |
DEGREES() |
ממירה מרדיאנים למעלות. |
EXP() |
מחזירה את e בחזקת הארגומנט. |
FLOOR() |
מעגלת את הארגומנט כלפי מטה למספר השלם הקרוב ביותר. |
LN()LOG()
|
הפונקציה מחזירה את הלוגריתם הטבעי של הארגומנט. |
LOG2() |
הפונקציה מחזירה את הלוגריתם של הארגומנט לפי בסיס 2. |
LOG10() |
מחזירה את הלוגריתם של הארגומנט לפי בסיס 10. |
PI() |
הפונקציה מחזירה את הקבוע π. |
POW() |
הפונקציה מחזירה את הארגומנט הראשון בחזקת הארגומנט השני. |
RADIANS() |
ממירה ממעלות לרדיאנים. |
RAND() |
מחזירה ערך אקראי של מספר ממשי בטווח 0.0 <= value < 1.0. |
ROUND() |
מעגלת את הארגומנט כלפי מעלה או מטה למספר השלם הקרוב ביותר. |
SIN() |
הפונקציה מחזירה את הסינוס של הארגומנט. |
SINH() |
הפונקציה מחזירה את הסינוס ההיפרבולי של הארגומנט. |
SQRT() |
הפונקציה מחזירה את השורש הריבועי של הביטוי. |
TAN() |
מחזירה את הטנגנס של הארגומנט. |
TANH() |
הפונקציה מחזירה את הטנגנס ההיפרבולי של הארגומנט. |
ABS(numeric_expr)- הפונקציה מחזירה את הערך המוחלט של הארגומנט.
ACOS(numeric_expr)- מחזירה את ארק הקוסינוס של הארגומנט.
ACOSH(numeric_expr)
- מחזירה את ההופכי של הקוסינוס ההיפרבולי של הארגומנט.
ASIN(numeric_expr)- מחזירה את ארקסינוס של הארגומנט.
ASINH(numeric_expr)- מחזירה את היפוך הסינוס ההיפרבולי של הארגומנט.
ATAN(numeric_expr)
- מחזירה את ארק טנגנס של הארגומנט.
ATANH(numeric_expr)
- מחזירה את היפוך הטנגנס ההיפרבולי של הארגומנט.
ATAN2(numeric_expr1, numeric_expr2)
- מחזירה את ארק טנגנס של שני הארגומנטים.
CEIL(numeric_expr)
- מעגלת את הארגומנט כלפי מעלה למספר השלם הקרוב ביותר ומחזירה את הערך המעוגל.
COS(numeric_expr)
- מחזירה את הקוסינוס של הארגומנט.
COSH(numeric_expr)
- מחזירה את הקוסינוס ההיפרבולי של הארגומנט.
DEGREES(numeric_expr)
- Returns
numeric_expr, converted from radians to degrees. EXP(numeric_expr)- הפונקציה מחזירה את התוצאה של העלאת הקבוע e – בסיס הלוגריתם הטבעי – בחזקת numeric_expr.
FLOOR(numeric_expr)- מעגלת את הארגומנט כלפי מטה למספר השלם הקרוב ביותר ומחזירה את הערך המעוגל.
LN(numeric_expr)
LOG(numeric_expr)
- מחזירה את הלוגריתם הטבעי של הארגומנט.
LOG2(numeric_expr)
- מחזירה את הלוגריתם של הארגומנט לפי בסיס 2.
LOG10(numeric_expr)
- מחזירה את הלוגריתם של הארגומנט לפי בסיס 10.
PI()- הפונקציה מחזירה את הקבוע π. הפונקציה
PI()מחייבת שימוש בסוגריים כדי לציין שהיא פונקציה, אבל לא מקבלת ארגומנטים בתוך הסוגריים. אפשר להשתמש ב-PI()כמו בקבוע עם פונקציות מתמטיות ואריתמטיות. POW(numeric_expr1, numeric_expr2)
- Returns the result of raising
numeric_expr1to the power ofnumeric_expr2. RADIANS(numeric_expr)
- Returns
numeric_expr, converted from degrees to radians. (הערה: π רדיאנים שווים ל-180 מעלות). RAND([int32_seed])
- מחזירה ערך אקראי של מספר עשרוני בטווח 0.0 <= value < 1.0. כל ערך של
int32_seedתמיד יוצר את אותו רצף של מספרים אקראיים בתוך שאילתה נתונה, כל עוד לא משתמשים בסעיףLIMIT. אם לא מציינים אתint32_seed, BigQuery משתמש בחותמת הזמן הנוכחית כערך ה-seed. ROUND(numeric_expr [, digits])
- Rounds מעגלת את הארגומנט כלפי מעלה או מטה למספר השלם הקרוב ביותר (או למספר הספרות שצוין, אם צוין) ומחזירה את הערך המעוגל.
SIN(numeric_expr)- מחזירה את הסינוס של הארגומנט.
SINH(numeric_expr)
- מחזירה את הסינוס ההיפרבולי של הארגומנט.
SQRT(numeric_expr)
- מחזירה את השורש הריבועי של הביטוי.
TAN(numeric_expr)
- מחזירה את הטנגנס של הארגומנט.
TANH(numeric_expr)
- מחזירה את הטנגנס ההיפרבולי של הארגומנט.
דוגמאות מתקדמות
-
שאילתת תיבה תוחמת
השאילתה הבאה מחזירה אוסף של נקודות בתוך תיבת תוחמת מלבנית שממורכזת סביב סן פרנסיסקו (37.46, -122.50).
לדוגמה:
#legacySQL SELECT year, month, AVG(mean_temp) avg_temp, MIN(min_temperature) min_temp, MAX(max_temperature) max_temp FROM [weather_geo.table] WHERE /* Return values between a pair of */ /* latitude and longitude coordinates */ lat / 1000 > 37.46 AND lat / 1000 < 37.65 AND long / 1000 > -122.50 AND long / 1000 < -122.30 GROUP BY year, month ORDER BY year, month ASC;
-
שאילתה של עיגול חוסם משוער
הפונקציה מחזירה אוסף של עד 100 נקודות בתוך מעגל משוער שנקבע על ידי שימוש בחוק הקוסינוסים הכדורי, עם מרכז בדנוור, קולורדו (39.73, -104.98). השאילתה הזו משתמשת בפונקציות מתמטיות וטריגונומטריות של BigQuery, כמו
PI(),SIN()ו-COS().כדור הארץ הוא לא כדור מושלם, וקווי האורך וקווי הרוחב מתכנסים בקטבים. לכן השאילתה הזו מחזירה קירוב שיכול להיות שימושי עבור סוגים רבים של נתונים.
לדוגמה:
#legacySQL SELECT distance, lat, long, temp FROM (SELECT ((ACOS(SIN(39.73756700 * PI() / 180) * SIN((lat/1000) * PI() / 180) + COS(39.73756700 * PI() / 180) * COS((lat/1000) * PI() / 180) * COS((-104.98471790 - (long/1000)) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance, AVG(mean_temp) AS temp, AVG(lat/1000) lat, AVG(long/1000) long FROM [weather_geo.table] WHERE month=1 GROUP BY distance) WHERE distance < 100 ORDER BY distance ASC LIMIT 100;
פונקציות של ביטויים רגולריים
BigQuery מספק תמיכה בביטויים רגולריים באמצעות ספריית re2. אפשר לעיין במסמכי התיעוד של הספרייה כדי לראות את התחביר של הביטויים הרגולריים.
שימו לב שהביטויים הרגולריים הם התאמות גלובליות. כדי להתחיל התאמה בתחילת מילה, צריך להשתמש בתו ^.
תחביר
| פונקציות של ביטויים רגולריים | |
|---|---|
REGEXP_MATCH() |
הפונקציה מחזירה את הערך True אם הארגומנט תואם לביטוי הרגולרי. |
REGEXP_EXTRACT() |
הפונקציה מחזירה את החלק של הארגומנט שתואם לקבוצת הלכידה בביטוי הרגולרי. |
REGEXP_REPLACE() |
מחליפה תת-מחרוזת שתואמת לביטוי רגולרי. |
REGEXP_MATCH('str', 'reg_exp')הפונקציה מחזירה את הערך True אם str תואם לביטוי הרגולרי. כדי לבצע התאמה של מחרוזות בלי ביטויים רגולריים, משתמשים בפונקציה CONTAINS במקום בפונקציה REGEXP_MATCH.
לדוגמה:
#legacySQL SELECT word, COUNT(word) AS count FROM [bigquery-public-data:samples.shakespeare] WHERE (REGEXP_MATCH(word,r'\w\w\'\w\w')) GROUP BY word ORDER BY count DESC LIMIT 3;
החזרות:
+-------+-------+ | word | count | +-------+-------+ | ne'er | 42 | | we'll | 35 | | We'll | 33 | +-------+-------+
REGEXP_EXTRACT('str', 'reg_exp')הפונקציה מחזירה את החלק של str שתואם לקבוצת הלכידה בביטוי הרגולרי.
לדוגמה:
#legacySQL SELECT REGEXP_EXTRACT(word,r'(\w\w\'\w\w)') AS fragment FROM [bigquery-public-data:samples.shakespeare] GROUP BY fragment ORDER BY fragment LIMIT 3;
החזרות:
+----------+ | fragment | +----------+ | NULL | | Al'ce | | As'es | +----------+
REGEXP_REPLACE('orig_str', 'reg_exp', 'replace_str')הפונקציה מחזירה מחרוזת שבה כל מחרוזת משנה של orig_str שתואמת ל-reg_exp מוחלפת ב-replace_str. לדוגמה, REGEXP_REPLACE ('Hello', 'lo', 'p') מחזירה Help.
לדוגמה:
#legacySQL SELECT REGEXP_REPLACE(word, r'ne\'er', 'never') AS expanded_word FROM [bigquery-public-data:samples.shakespeare] WHERE REGEXP_MATCH(word, r'ne\'er') GROUP BY expanded_word ORDER BY expanded_word LIMIT 5;
החזרות:
+---------------+ | expanded_word | +---------------+ | Whenever | | never | | nevertheless | | whenever | +---------------+
דוגמאות מתקדמות
-
סינון של קבוצת התוצאות לפי התאמה של ביטוי רגולרי
אפשר להשתמש בפונקציות של ביטויים רגולריים ב-BigQuery כדי לסנן תוצאות בסעיף
WHERE, וגם כדי להציג תוצאות בסעיףSELECT. בדוגמה הבאה משולבים שני תרחישי השימוש האלה בביטויים רגולריים בשאילתה אחת.לדוגמה:
#legacySQL SELECT /* Replace white spaces in the title with underscores. */ REGEXP_REPLACE(title, r'\s+', '_') AS regexp_title, revisions FROM (SELECT title, COUNT(revision_id) as revisions FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace=0 /* Match titles that start with 'G', end with * 'e', and contain at least two 'o's. */ AND REGEXP_MATCH(title, r'^G.*o.*o.*e$') GROUP BY title ORDER BY revisions DESC LIMIT 100);
-
שימוש בביטויים רגולריים בנתוני מספרים שלמים או בנתוני מספרים עשרוניים
פונקציות הביטוי הרגולרי של BigQuery פועלות רק על נתוני מחרוזות, אבל אפשר להשתמש בפונקציה
STRING()כדי להמיר נתוני מספרים שלמים או נתונים מסוג float לפורמט מחרוזת. בדוגמה הזו, הפונקציהSTRING()משמשת להמרת הערך השלםcorpus_dateלמחרוזת, שמשתנה לאחר מכן באמצעות הפונקציהREGEXP_REPLACE.לדוגמה:
#legacySQL SELECT corpus_date, /* Cast the corpus_date to a string value */ REGEXP_REPLACE(STRING(corpus_date), '^16', 'Written in the sixteen hundreds, in the year \'' ) AS date_string FROM [bigquery-public-data:samples.shakespeare] /* Cast the corpus_date to string, */ /* match values that begin with '16' */ WHERE REGEXP_MATCH(STRING(corpus_date), '^16') GROUP BY corpus_date, date_string ORDER BY date_string DESC LIMIT 5;
פונקציות מחרוזת
פונקציות מחרוזת פועלות על נתוני מחרוזת. קבועי מחרוזות צריכים להיות מוקפים בגרשיים או במירכאות. כברירת מחדל, פונקציות מחרוזת הן תלוית אותיות רישיות.
אפשר לצרף IGNORE CASE לסוף של שאילתה כדי להפעיל התאמה לא תלוית-רישיות. הפונקציה IGNORE CASE פועלת רק על תווי ASCII
ורק ברמה העליונה של השאילתה.
הפונקציות האלה לא תומכות בתווים כלליים לחיפוש. כדי להשתמש בפונקציונליות של ביטויים רגולריים, צריך להשתמש בפונקציות של ביטויים רגולריים.
תחביר
| פונקציות מחרוזת | |
|---|---|
CONCAT() |
הפונקציה מחזירה את השרשור של שתי מחרוזות או יותר, או NULL אם אחד מהערכים הוא NULL. |
expr CONTAINS 'str' |
הפונקציה מחזירה true אם expr מכיל את ארגומנט המחרוזת שצוין. |
INSTR() |
הפונקציה מחזירה את האינדקס מבוסס-1 של המופע הראשון של מחרוזת. |
LEFT() |
הפונקציה מחזירה את התווים הימניים ביותר של מחרוזת. |
LENGTH() |
הפונקציה מחזירה את אורך המחרוזת. |
LOWER() |
הפונקציה מחזירה את המחרוזת המקורית עם כל התווים באותיות קטנות. |
LPAD() |
הפונקציה מוסיפה תווים משמאל למחרוזת. |
LTRIM() |
הפונקציה מסירה תווים מהצד השמאלי של מחרוזת. |
REPLACE() |
הפונקציה מחליפה את כל המופעים של מחרוזת משנה. |
RIGHT() |
הפונקציה מחזירה את התווים הכי שמאליים במחרוזת. |
RPAD() |
הפונקציה מוסיפה תווים לצד ימין של מחרוזת. |
RTRIM() |
מסירה תווים מסוף המחרוזת. |
SPLIT() |
מפצלת מחרוזת למחרוזות משנה חוזרות. |
SUBSTR() |
הפונקציה מחזירה מחרוזת משנה ... |
UPPER() |
הפונקציה מחזירה את המחרוזת המקורית עם כל התווים באותיות גדולות. |
CONCAT('str1', 'str2', '...')
str1 + str2 + ...
- מחזירה את השרשור של שתי מחרוזות או יותר, או NULL אם אחד מהערכים הוא NULL. דוגמה: אם
str1הואJavaו-str2הואScript, הפונקציהCONCATמחזירהJavaScript. expr CONTAINS 'str'
הפונקציה - מחזירה
trueאםexprמכיל את ארגומנט המחרוזת שצוין. ההשוואה היא תלוית אותיות רישיות. INSTR('str1', 'str2')
- מחזירה את האינדקס מבוסס-1 של המופע הראשון של str2 ב-str1, או מחזירה 0 אם str2 לא מופיע ב-str1.
LEFT('str', numeric_expr)- הפונקציה מחזירה את numeric_expr התווים הימניים ביותר של
str. אם המספר ארוך יותר מ-str, המחרוזת המלאה תוחזר. לדוגמה: הפונקציהLEFT('seattle', 3)מחזירהsea. LENGTH('str')- מחזירה ערך מספרי של אורך המחרוזת. דוגמה: אם
strהוא'123456', הפונקציהLENGTHמחזירה6. LOWER('str')
- מחזירה את המחרוזת המקורית עם כל התווים באותיות קטנות.
LPAD('str1', numeric_expr, 'str2')
- Pads
str1בצד שמאל עםstr2, חוזר עלstr2עד שמחרוזת התוצאה היא בדיוקnumeric_exprתווים. לדוגמה: הפונקציהLPAD('1', 7, '?')מחזירה??????1. LTRIM('str1' [, str2])-
מסירה תווים מהצד השמאלי של str1. אם משמיטים את str2, הפונקציה
LTRIMמסירה רווחים מהצד השמאלי של str1. אחרת, הפונקציהLTRIMמסירה את כל התווים ב-str2 מהצד השמאלי של str1 (ההשוואה היא תלוית-אותיות רישיות).לדוגמה:
SELECT LTRIM("Say hello", "yaS")returns" hello".
SELECT LTRIM("Say hello", " ySa")returns"hello". REPLACE('str1', 'str2', 'str3')-
הפונקציה מחליפה את כל המופעים של str2 בתוך str1 ב-str3.
RIGHT('str', numeric_expr)- הפונקציה מחזירה את numeric_expr התווים הימניים ביותר של
str. אם המספר ארוך יותר מהמחרוזת, הפונקציה תחזיר את המחרוזת כולה. לדוגמה: הפונקציהRIGHT('kirkland', 4)מחזירהland. RPAD('str1', numeric_expr, 'str2')
- Pads
str1on the right withstr2, repeatingstr2until the result string is exactlynumeric_exprcharacters. לדוגמה: הפונקציהRPAD('1', 7, '?')מחזירה1??????. RTRIM('str1' [, str2])-
מסירה תווים מסוף המחרוזת str1 בצד שמאל. אם משמיטים את הארגומנט str2, הפונקציה
RTRIMמסירה רווחים בסוף המחרוזת str1. אחרת, הפונקציהRTRIMמסירה את כל התווים ב-str2 מהצד הימני של str1 (ההשוואה בין האותיות תלויה באותיות רישיות).לדוגמה:
SELECT RTRIM("Say hello", "leo")returns"Say h".
SELECT RTRIM("Say hello ", " hloe")returns"Say". SPLIT('str' [, 'delimiter'])- מפצלת מחרוזת למחרוזות משנה חוזרות. אם מציינים את
delimiter, הפונקציהSPLITמפצלת אתstrלמחרוזות משנה, באמצעותdelimiterכתו המפריד. SUBSTR('str', index [, max_len])- מחזירה מחרוזת משנה של
str, החל מindex. אם משתמשים בפרמטר האופציונליmax_len, המחרוזת שמוחזרת היא באורך שלmax_lenתווים לכל היותר. הספירה מתחילה מ-1, כך שהתו הראשון במחרוזת נמצא במיקום 1 (ולא במיקום 0). אםindexהוא5, המחרוזת המשנית מתחילה בתו החמישי משמאל ב-str. אםindexהוא-4, מחרוזת המשנה מתחילה בתו הרביעי מימין ב-str. דוגמה: הפונקציהSUBSTR('awesome', -4, 4)מחזירה את מחרוזת המשנהsome. UPPER('str')
- מחזירה את המחרוזת המקורית עם כל התווים באותיות רישיות.
שימוש בתו בריחה (escape) לתווים מיוחדים במחרוזות
כדי להשתמש בתו בריחה (escape) עם תווים מיוחדים, אפשר להשתמש באחת מהשיטות הבאות:
- משתמשים בסימון
'\xDD', כאשר'\x'מופיע לפני הייצוג ההקסדצימלי של התו בן שתי הספרות. - צריך להשתמש בקו נטוי לפני קווים נטויים, גרשיים ומירכאות.
- לתווים אחרים, משתמשים ברצפים בסגנון C (
'\a', '\b', '\f', '\n', '\r', '\t',ו-'\v').
דוגמאות לשימוש בתווי Escape:
'this is a space: \x20'
'this string has \'single quote\' inside it'
'first line \n second line'
"double quotes are also ok"
'\070' -> ERROR: octal escaping is not supported
פונקציות של תווים כלליים לחיפוש בטבלאות
פונקציות של תו כללי לחיפוש בטבלאות הן דרך נוחה לשאילתת נתונים ממערך מסוים של טבלאות. פונקציית תו כללי לחיפוש בטבלאות שווה לאיחוד של כל הטבלאות שתואמות לפונקציית התו הכללי לחיפוש, כשהן מופרדות באמצעות פסיק. כשמשתמשים בפונקציית wildcard של טבלה, BigQuery ניגש רק לטבלאות שתואמות ל-wildcard, ומחייב רק על הטבלאות האלה. פונקציות של תו כללי לחיפוש בטבלאות מצוינות בסעיף FROM של השאילתה.
אם משתמשים בפונקציות של תו כללי לחיפוש בטבלאות בשאילתה, כבר לא צריך להוסיף את הפונקציות בתוך סוגריים. לדוגמה, בחלק מהדוגמאות הבאות נעשה שימוש בסוגריים, ובחלק לא.
תוצאות שנשמרו במטמון אינן נתמכות עבור שאילתות מול מספר טבלאות באמצעות פונקציית תו כללי לחיפוש (גם אם האפשרות שימוש בתוצאות במטמון מסומנת). אם תפעילו כמה פעמים את אותה שאילתה עם תו כללי לחיפוש, תחויבו על כל שאילתה.
תחביר
| פונקציות של תווים כלליים לחיפוש בטבלאות | |
|---|---|
TABLE_DATE_RANGE() |
השאילתה מופעלת על כמה טבלאות יומיות שמתפרסות על פני טווח תאריכים. |
TABLE_DATE_RANGE_STRICT() |
השאילתות מורצות על כמה טבלאות יומיות בטווח תאריכים, ללא תאריכים חסרים. |
TABLE_QUERY() |
שאילתות בטבלאות שהשמות שלהן תואמים לפרדיקט שצוין. |
TABLE_DATE_RANGE(prefix, timestamp1, timestamp2)-
השאילתות מתבצעות על טבלאות יומיות שחופפות לטווח הזמן בין
<timestamp1>ל-<timestamp2>.שמות הטבלאות צריכים להיות בפורמט הבא:
<prefix><day>, כאשר<day>הוא בפורמטYYYYMMDD.אפשר להשתמש בפונקציות של תאריך ושעה כדי ליצור את פרמטרים של חותמת הזמן. לדוגמה:
TIMESTAMP('2012-10-01 02:03:04')DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
דוגמה: קבלת טבלאות בין שני תאריכים
בדוגמה הזו, נניח שהטבלאות הבאות קיימות:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
#legacySQL SELECT name FROM TABLE_DATE_RANGE([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27')) WHERE age >= 35
הטבלה תואמת לטבלאות הבאות:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
דוגמה: קבלת טבלאות של נתונים מטווח של יומיים עד 'עכשיו'
בדוגמה הזו מניחים שהטבלאות הבאות קיימות בפרויקט בשם
myproject-1234:- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
#legacySQL SELECT name FROM (TABLE_DATE_RANGE([myproject-1234:mydata.people], DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())) WHERE age >= 35
הטבלה תואמת לטבלאות הבאות:
- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
TABLE_DATE_RANGE_STRICT(prefix, timestamp1, timestamp2)-
הפונקציה הזו שוות ערך לפונקציה
TABLE_DATE_RANGE. ההבדל היחיד הוא שאם חסרה טבלה יומית כלשהי ברצף, הפונקציהTABLE_DATE_RANGE_STRICTנכשלת ומחזירה שגיאתNot Found: Table <table_name>.דוגמה: שגיאה בטבלה חסרה
בדוגמה הזו, נניח שהטבלאות הבאות קיימות:
- people20140325
- people20140327
#legacySQL SELECT name FROM (TABLE_DATE_RANGE_STRICT([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27'))) WHERE age >= 35
בדוגמה שלמעלה, השגיאה 'לא נמצא' מוחזרת עבור הטבלה people20140326.
TABLE_QUERY(dataset, expr)-
שאילתות בטבלאות שהשמות שלהן תואמים ל-
exprשצוין. הפרמטרexprצריך להיות מיוצג כמחרוזת ולהכיל ביטוי להערכה. לדוגמה,'length(table_id) < 3'.דוגמה: התאמה של טבלאות שהשמות שלהן מכילים את המחרוזת oo והאורך שלהן גדול מ-4
בדוגמה הזו, נניח שהטבלאות הבאות קיימות:
- mydata.boo
- mydata.fork
- mydata.ooze
- mydata.spoon
#legacySQL SELECT speed FROM (TABLE_QUERY([myproject-1234:mydata], 'table_id CONTAINS "oo" AND length(table_id) >= 4'))
הטבלה תואמת לטבלאות הבאות:
- mydata.ooze
- mydata.spoon
דוגמה: התאמה לטבלאות שהשמות שלהן מתחילים ב-boo, ואחריהן 3-5 ספרות
בדוגמה הזו מניחים שהטבלאות הבאות קיימות בפרויקט בשם
myproject-1234:- mydata.book4
- mydata.book418
- mydata.boom12345
- mydata.boom123456789
- mydata.taboo999
#legacySQL SELECT speed FROM TABLE_QUERY([myproject-1234:mydata], 'REGEXP_MATCH(table_id, r"^boo[\d]{3,5}")')
הטבלה תואמת לטבלאות הבאות:
- mydata.book418
- mydata.boom12345
פונקציות של כתובות URL
תחביר
| פונקציות של כתובות URL | |
|---|---|
HOST() |
בהינתן כתובת URL, הפונקציה מחזירה את שם המארח כמחרוזת. |
DOMAIN() |
בהינתן כתובת URL, הפונקציה מחזירה את הדומיין כמחרוזת. |
TLD() |
בהינתן כתובת URL, הפונקציה מחזירה את הדומיין ברמה העליונה בתוספת דומיין של מדינה כלשהי בכתובת ה-URL. |
HOST('url_str')- בהינתן כתובת URL, הפונקציה מחזירה את שם המארח כמחרוזת. דוגמה: HOST('http://www.google.com:80/index.html') מחזירה 'www.google.com'
DOMAIN('url_str')- בהינתן כתובת URL, הפונקציה מחזירה את הדומיין כמחרוזת. דוגמה: DOMAIN('http://www.google.com:80/index.html') מחזירה 'google.com'.
TLD('url_str')
- בהינתן כתובת URL, הפונקציה מחזירה את הדומיין ברמה העליונה בתוספת דומיין של מדינה בכתובת ה-URL. דוגמה: TLD('http://www.google.com:80/index.html') מחזירה '.com'. TLD('http://www.google.co.uk:80/index.html') מחזירה '.co.uk'.
הערות:
- הפונקציות האלה לא מבצעות חיפוש DNS הפוך, ולכן אם קוראים להן באמצעות כתובת IP, הן יחזירו פלחים של כתובת ה-IP ולא פלחים של שם המארח.
- כל הפונקציות לניתוח כתובות URL מצפות לתווים באותיות קטנות. אם כתובת ה-URL מכילה תווים באותיות רישיות, התוצאה תהיה NULL או שגויה. אם הנתונים כוללים אותיות רישיות וקטנות, כדאי להעביר קלט לפונקציה הזו באמצעות LOWER().
דוגמה מתקדמת
ניתוח שמות דומיינים מנתוני כתובות URL
בשאילתה הזו נעשה שימוש בפונקציה DOMAIN() כדי להחזיר את הדומיינים הפופולריים ביותר שמופיעים כדפי הבית של מאגרים ב-GitHub. שימו לב לשימוש ב-HAVING כדי לסנן רשומות באמצעות התוצאה של הפונקציה DOMAIN(). זו פונקציה שימושית לקביעת פרטי המפנה מנתוני כתובת URL.
לדוגמה:
#legacySQL SELECT DOMAIN(repository_homepage) AS user_domain, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_domain HAVING user_domain IS NOT NULL AND user_domain != '' ORDER BY activity_count DESC LIMIT 5;
החזרות:
+-----------------+----------------+ | user_domain | activity_count | +-----------------+----------------+ | github.com | 281879 | | google.com | 34769 | | khanacademy.org | 17316 | | sourceforge.net | 15103 | | mozilla.org | 14091 | +-----------------+----------------+
כדי לבדוק מידע ספציפי על TLD, משתמשים בפונקציה TLD(). בדוגמה הזו מוצגים הדומיינים ברמה העליונה (TLD) הכי פופולריים שלא מופיעים ברשימה של דוגמאות נפוצות.
#legacySQL SELECT TLD(repository_homepage) AS user_tld, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_tld HAVING /* Only consider TLDs that are NOT NULL */ /* or in our list of common TLDs */ user_tld IS NOT NULL AND NOT user_tld IN ('','.com','.net','.org','.info','.edu') ORDER BY activity_count DESC LIMIT 5;
החזרות:
+----------+----------------+ | user_tld | activity_count | +----------+----------------+ | .de | 22934 | | .io | 17528 | | .me | 13652 | | .fr | 12895 | | .co.uk | 9135 | +----------+----------------+
פונקציות חלון
פונקציות חלון, שנקראות גם פונקציות אנליטיות, מאפשרות לבצע חישובים על קבוצת משנה ספציפית, או 'חלון', של קבוצת תוצאות. פונקציות חלון מקלות על יצירת דוחות שכוללים ניתוחים מורכבים, כמו ממוצעים נעים וסכומים מצטברים.
לכל פונקציה אנליטית (window function) נדרש פסוקית OVER שמציינת את החלק העליון והתחתון של החלון. שלושת הרכיבים של סעיף OVER (חלוקה למחיצות, סדר ומסגור) מספקים שליטה נוספת בחלון. חלוקה למחיצות מאפשרת לכם לחלק את נתוני הקלט לקבוצות לוגיות עם מאפיין משותף. המיון מאפשר לכם למיין את התוצאות בתוך מחיצה. המסגור מאפשר ליצור מסגרת חלון הזזה בתוך מחיצה שזזה ביחס לשורה הנוכחית. אפשר להגדיר את הגודל של מסגרת החלון הנע על סמך מספר השורות או טווח ערכים, כמו מרווח זמן.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY- מגדיר את המחיצה הבסיסית שהפונקציה פועלת עליה.
מציינים שם של עמודה אחת או יותר שמופרדים בפסיקים. תיווצר מחיצה אחת לכל קבוצה נפרדת של ערכים בעמודות האלה, בדומה לסעיף
GROUP BY. אם לא מציינים אתPARTITION BY, מחיצת הבסיס היא כל השורות בקלט של פונקציה אנליטית (window function). - הסעיף
PARTITION BYמאפשר גם לפונקציות אנליטיות (window function) לחלק את הנתונים ולבצע את הפעולות במקביל. אם רוצים להשתמש בפונקציה אנליטית (window function) עםallowLargeResults, או אם מתכוונים להחיל עוד הצטרפויות או צבירות נתונים על הפלט של פונקציית החלון, צריך להשתמש ב-PARTITION BYכדי להריץ את הפעולות במקביל.
אי אפשר להשתמש בסעיפים JOIN EACHו-GROUP EACH BYבפלט של פונקציות חלון. כדי ליצור תוצאות גדולות של שאילתות כשמשתמשים בפונקציות חלון, צריך להשתמש ב-PARTITION BY.ORDER BY- מיון המחיצה. אם לא מציינים את הערך
ORDER BY, אין ערובה לסדר מיון ברירת מחדל כלשהו. המיון מתבצע ברמת המחיצה, לפני שמחילים סעיף של מסגרת חלון. אם מציינים חלוןRANGE, צריך להוסיף פסקהORDER BY. סדר ברירת המחדל הואASC.
ORDER BYהוא אופציונלי במקרים מסוימים, אבל פונקציות חלון מסוימות, כמו rank() או dense_rank(), דורשות את הסעיף.
- אם משתמשים ב-
ORDER BYבלי לציין אתROWSאו אתRANGE, המשמעות שלORDER BYהיא שהחלון מתחיל מתחילת החלוקה ומגיע עד לשורה הנוכחית. אם לא מצייניםORDER BYסעיף, החלון הוא כל המחיצה. <window-frame-clause>-
{ROWS | RANGE} {BETWEEN <start> AND <end> | <start> | <end>} - תת-קבוצה של המחיצה שעליה יתבצעו הפעולות. הגודל יכול להיות זהה לגודל המחיצה או קטן ממנו. אם משתמשים ב-
ORDER BYבליwindow-frame-clause, מסגרת ברירת המחדל של החלון היאRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. אם לא מציינים אתORDER BYואתwindow-frame-clause, מסגרת ברירת המחדל של החלון היא כל המחיצה.-
ROWS– מגדיר חלון במונחים של מיקום שורה, ביחס לשורה הנוכחית. לדוגמה, כדי להוסיף עמודה שמציגה את הסכום של 5 השורות הקודמות של ערכי השכר, תריצו את השאילתהSUM(salary) OVER (ROWS BETWEEN 5 PRECEDING AND CURRENT ROW). בדרך כלל, קבוצת השורות כוללת את השורה הנוכחית, אבל זה לא חובה. -
RANGE– מגדיר חלון במונחים של טווח ערכים בעמודה נתונה, ביחס לערך של העמודה בשורה הנוכחית. הפונקציה פועלת רק על מספרים ותאריכים, כאשר ערכי התאריך הם מספרים שלמים פשוטים (מיקרו-שניות מאז תקופת הבסיס). שורות סמוכות עם אותו ערך נקראות שורות עמיתות. שורות מקבילות שלCURRENT ROWנכללות במסגרת חלון שמציינתCURRENT ROW. לדוגמה, אם מציינים שסוף החלון הואCURRENT ROWולשורה הבאה בחלון יש את אותו ערך, היא תיכלל בחישוב של הפונקציה. -
BETWEEN <start> AND <end>– טווח, כולל שורות ההתחלה והסיום. הטווח לא צריך לכלול את השורה הנוכחית, אבל<start>חייב להיות לפני<end>או שווה לו. -
<start>– מציין את היסט ההתחלה של חלון הזמן הזה, ביחס לשורה הנוכחית. אלו האפשרויות שנתמכות: כאשר{UNBOUNDED PRECEDING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}<expr>הוא מספר שלם חיובי,PRECEDINGמציין מספר שורה או ערך טווח שקודמים, ו-FOLLOWINGמציין מספר שורה או ערך טווח שבאים אחרי. UNBOUNDED PRECEDINGמייצג את השורה הראשונה במחיצה. אם ההתחלה קודמת לחלון, היא תוגדר לשורה הראשונה של החלוקה. -
<end>– מציין את היסט הסיום עבור חלון זה, ביחס לשורה הנוכחית. אלו האפשרויות שנתמכות: כאשר{UNBOUNDED FOLLOWING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}<expr>הוא מספר שלם חיובי,PRECEDINGמציין מספר שורה או ערך טווח קודמים, ו-FOLLOWINGמציין מספר שורה או ערך טווח עוקבים. UNBOUNDED FOLLOWINGמציין את השורה האחרונה במחיצה. אם הערך של end חורג מסוף החלון, הוא יוגדר לשורה האחרונה של החלוקה.
-
בניגוד לפונקציות צבירה שמצמצמות הרבה שורות קלט לשורת פלט אחת, פונקציות חלון מחזירות שורת פלט אחת לכל שורת קלט.
התכונה הזו מקלה על יצירת שאילתות שמחשבות סכומים מצטברים וממוצעים נעים. לדוגמה, השאילתה הבאה מחזירה סכום מצטבר של קבוצת נתונים קטנה של חמש שורות שמוגדרת על ידי הצהרות SELECT:
#legacySQL SELECT name, value, SUM(value) OVER (ORDER BY value) AS RunningTotal FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
הערך המוחזר:
+------+-------+--------------+ | name | value | RunningTotal | +------+-------+--------------+ | a | 0 | 0 | | b | 1 | 1 | | c | 2 | 3 | | d | 3 | 6 | | e | 4 | 10 | +------+-------+--------------+
בדוגמה הבאה מחושב ממוצע נע של הערכים בשורה הנוכחית ובשורה הקודמת. מסגרת החלון מורכבת משתי שורות שזזות עם השורה הנוכחית.
#legacySQL SELECT name, value, AVG(value) OVER (ORDER BY value ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS MovingAverage FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
הערך המוחזר:
+------+-------+---------------+ | name | value | MovingAverage | +------+-------+---------------+ | a | 0 | 0.0 | | b | 1 | 0.5 | | c | 2 | 1.5 | | d | 3 | 2.5 | | e | 4 | 3.5 | +------+-------+---------------+
תחביר
| פונקציות חלון | |
|---|---|
AVG()COUNT(*)COUNT([DISTINCT])MAX()MIN()STDDEV()SUM() |
אותה פעולה כמו פונקציות הצבירה המתאימות, אבל החישוב מתבצע על חלון שמוגדר על ידי פסוקית OVER. |
CUME_DIST() |
מחזירה ערך כפול שמציין את ההתפלגות המצטברת של ערך בקבוצת ערכים ... |
DENSE_RANK() |
הפונקציה מחזירה את הדירוג של ערך בקבוצת ערכים כמספר שלם. |
FIRST_VALUE() |
הפונקציה מחזירה את הערך הראשון של השדה שצוין בחלון. |
LAG() |
הפונקציה מאפשרת לקרוא נתונים משורה קודמת בחלון. |
LAST_VALUE() |
הפונקציה מחזירה את הערך האחרון של השדה שצוין בחלון. |
LEAD() |
מאפשר לקרוא נתונים משורה הבאה בחלון. |
NTH_VALUE() |
הפונקציה מחזירה את הערך של <expr> במיקום
<n> של מסגרת החלון ...
|
NTILE() |
מחלקת את החלון למספר הדליים שצוין. |
PERCENT_RANK() |
הפונקציה מחזירה את הדירוג של השורה הנוכחית ביחס לשאר השורות במחיצה. |
PERCENTILE_CONT() |
הפונקציה מחזירה ערך משוער שמתאים לארגומנט של האחוזון ביחס לחלון ... |
PERCENTILE_DISC() |
הפונקציה מחזירה את הערך הקרוב ביותר לאחוזון של הארגומנט בחלון. |
RANK() |
הפונקציה מחזירה את הדירוג של ערך בקבוצת ערכים כמספר שלם. |
RATIO_TO_REPORT() |
הפונקציה מחזירה את היחס של כל ערך לסכום הערכים. |
ROW_NUMBER() |
הפונקציה מחזירה את מספר השורה הנוכחי של תוצאת השאילתה בחלון. |
-
AVG(numeric_expr)
COUNT(*)
COUNT([DISTINCT] field)
MAX(field)
MIN(field)
STDDEV(numeric_expr)
SUM(field)
-
פונקציות החלון האלה מבצעות את אותה פעולה כמו פונקציות הצבירה המתאימות, אבל הן מחושבות על חלון שמוגדר על ידי פסוקית ה-OVER.
הבדל משמעותי נוסף הוא שהפונקציה
COUNT([DISTINCT] field)מחזירה תוצאות מדויקות כשמשתמשים בה כפונקציה אנליטית (window function), וההתנהגות שלה דומה לזו של פונקציית הצבירהEXACT_COUNT_DISTINCT().בדוגמת השאילתה, סעיף
ORDER BYגורם לחישוב החלון מתחילת החלוקה ועד לשורה הנוכחית, וכך נוצר סכום מצטבר לאותה שנה.#legacySQL SELECT corpus_date, corpus, word_count, SUM(word_count) OVER ( PARTITION BY corpus_date ORDER BY word_count) annual_total FROM [bigquery-public-data:samples.shakespeare] WHERE word='love' ORDER BY corpus_date, word_count
החזרות:
corpus_date קורפוס word_count annual_total 0 שונים 37 37 0 סונטות 157 194 1590 2kinghenryvi 18 18 1590 1kinghenryvi 24 42 1590 3kinghenryvi 40 82 CUME_DIST()-
הפונקציה מחזירה ערך מסוג double שמציין את ההתפלגות המצטברת של ערך בקבוצת ערכים, שמחושבת באמצעות הנוסחה
<number of rows preceding or tied with the current row> / <total rows>. ערכים שווים מחזירים את אותו ערך של התפלגות מצטברת.פונקציה אנליטית (window function) זו דורשת
ORDER BYבסעיףOVER.#legacySQL SELECT word, word_count, CUME_DIST() OVER (PARTITION BY corpus ORDER BY word_count DESC) cume_dist, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
החזרות:
מילה word_count cume_dist ממחטה 29 0.2 שביעות רצון 5 0.4 רוגז 4 0.8 כלי נגינה 4 0.8 נסיבות 3 1.0 DENSE_RANK()-
הפונקציה מחזירה את הדירוג של ערך בקבוצת ערכים כמספר שלם. הדירוג מחושב על סמך השוואות עם ערכים אחרים בקבוצה.
ערכים שווים מוצגים באותו דירוג. הדירוג של הערך הבא גדל ב-1. לדוגמה, אם שני ערכים מקבלים את הדירוג 2, הערך הבא בדירוג יהיה 3. אם אתם מעדיפים שיהיה פער ברשימת הדירוגים, השתמשו ב-rank().
פונקציה אנליטית (window function) זו דורשת
ORDER BYבסעיףOVER. החזרות:#legacySQL SELECT word, word_count, DENSE_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) dense_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count dense_rank ממחטה 29 1 שביעות רצון 5 2 רוגז 4 3 כלי נגינה 4 3 נסיבות 3 4 FIRST_VALUE(<field_name>)-
הפונקציה מחזירה את הערך הראשון של
<field_name>בחלון. החזרות:#legacySQL SELECT word, word_count, FIRST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) fv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
מילה word_count fv באופן לא מושלם 1 באופן לא מושלם LAG(<expr>[, <offset>[, <default_value>]])-
מאפשרת לקרוא נתונים משורה קודמת בחלון. באופן ספציפי,
LAG()מחזירה את הערך של<expr>בשורה שנמצאת<offset>שורות לפני השורה הנוכחית. אם השורה לא קיימת, הפונקציה<default_value>מחזירה.#legacySQL SELECT word, word_count, LAG(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lag, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
החזרות:
מילה word_count איטיות ממחטה 29 null שביעות רצון 5 ממחטה רוגז 4 שביעות רצון כלי נגינה 4 רוגז נסיבות 3 כלי נגינה LAST_VALUE(<field_name>)-
הפונקציה מחזירה את הערך האחרון של
<field_name>בחלון.#legacySQL SELECT word, word_count, LAST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) lv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
החזרות:
מילה word_count lv באופן לא מושלם 1 באופן לא מושלם LEAD(<expr>[, <offset>[, <default_value>]])-
מאפשר לקרוא נתונים משורה הבאה בחלון. באופן ספציפי,
LEAD()מחזירה את הערך של<expr>בשורה שנמצאת<offset>שורות אחרי השורה הנוכחית. אם השורה לא קיימת, הפונקציה<default_value>מוחזרת. החזרות:#legacySQL SELECT word, word_count, LEAD(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lead, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count ליד ממחטה 29 שביעות רצון שביעות רצון 5 רוגז רוגז 4 כלי נגינה כלי נגינה 4 נסיבות נסיבות 3 null NTH_VALUE(<expr>, <n>)-
הפונקציה מחזירה את הערך של
<expr>במיקום<n>של מסגרת החלון, כאשר<n>הוא אינדקס מבוסס-1. NTILE(<num_buckets>)-
מחלקת רצף של שורות ל-
<num_buckets>קטגוריות ומקצה לכל שורה מספר קטגוריה תואם, כמספר שלם. הפונקציהntile()מקצה את מספרי הדליים באופן שווה ככל האפשר ומחזירה ערך מ-1 עד<num_buckets>לכל שורה. החזרות:#legacySQL SELECT word, word_count, NTILE(2) OVER (PARTITION BY corpus ORDER BY word_count DESC) ntile, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count ntile ממחטה 29 1 שביעות רצון 5 1 רוגז 4 1 כלי נגינה 4 2 נסיבות 3 2 PERCENT_RANK()-
הפונקציה מחזירה את הדירוג של השורה הנוכחית ביחס לשאר השורות במחיצה. הערכים שמוחזרים הם בין 0 ל-1, כולל. הערך הראשון שמוחזר הוא 0.0.
פונקציה אנליטית (window function) זו דורשת
ORDER BYבסעיףOVER. החזרות:#legacySQL SELECT word, word_count, PERCENT_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) p_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count p_rank ממחטה 29 0.0 שביעות רצון 5 0.25 רוגז 4 0.5 כלי נגינה 4 0.5 נסיבות 3 1.0 PERCENTILE_CONT(<percentile>)-
הפונקציה מחזירה ערך משוער שמתאים לארגומנט של האחוזון ביחס לחלון, אחרי שהערכים סודרו לפי סעיף
ORDER BY.הערך
<percentile>חייב להיות בין 0 ל-1.פונקציה אנליטית (window function) זו דורשת
ORDER BYבסעיףOVER. החזרות:#legacySQL SELECT word, word_count, PERCENTILE_CONT(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_cont, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count p_cont ממחטה 29 4 שביעות רצון 5 4 רוגז 4 4 כלי נגינה 4 4 נסיבות 3 4 PERCENTILE_DISC(<percentile>)-
הפונקציה מחזירה את הערך הקרוב ביותר לאחוזון של הארגומנט בחלון.
הערך
<percentile>חייב להיות בין 0 ל-1.פונקציה אנליטית (window function) זו דורשת
ORDER BYבסעיףOVER. החזרות:#legacySQL SELECT word, word_count, PERCENTILE_DISC(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_disc, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count p_disc ממחטה 29 4 שביעות רצון 5 4 רוגז 4 4 כלי נגינה 4 4 נסיבות 3 4 RANK()-
הפונקציה מחזירה את הדירוג של ערך בקבוצת ערכים כמספר שלם. הדירוג מחושב על סמך השוואות עם ערכים אחרים בקבוצה.
ערכים שווים מוצגים באותו דירוג. הדירוג של הערך הבא גדל בהתאם למספר הערכים השווים שהיו לפניו. לדוגמה, אם שני ערכים מקבלים את הדירוג 2, הערך הבא בדירוג הוא 4 ולא 3. אם אתם מעדיפים שלא יהיו פערים ברשימת הדירוג, אתם יכולים להשתמש ב-dense_rank().
פונקציה אנליטית (window function) זו דורשת
ORDER BYבסעיףOVER. החזרות:#legacySQL SELECT word, word_count, RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count רמה ממחטה 29 1 שביעות רצון 5 2 רוגז 4 3 כלי נגינה 4 3 נסיבות 3 5 RATIO_TO_REPORT(<column>)-
הפונקציה מחזירה את היחס של כל ערך לסכום הערכים, כמספר עשרוני בין 0 ל-1.
החזרות:#legacySQL SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER (PARTITION BY corpus ORDER BY word_count DESC) r_to_r, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count r_to_r ממחטה 29 0.6444444444444445 שביעות רצון 5 0.1111111111111111 רוגז 4 0.08888888888888889 כלי נגינה 4 0.08888888888888889 נסיבות 3 0.06666666666666667 ROW_NUMBER()-
הפונקציה מחזירה את מספר השורה הנוכחי של תוצאת השאילתה בחלון, החל מ-1.
החזרות:#legacySQL SELECT word, word_count, ROW_NUMBER() OVER (PARTITION BY corpus ORDER BY word_count DESC) row_num, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
מילה word_count row_num ממחטה 29 1 שביעות רצון 5 2 רוגז 4 3 כלי נגינה 4 4 נסיבות 3 5
פונקציות אחרות
תחביר
| פונקציות אחרות | |
|---|---|
CASE WHEN ... THEN |
אפשר להשתמש ב-CASE כדי לבחור בין שני ביטויים חלופיים או יותר בשאילתה. |
CURRENT_USER() |
הפונקציה מחזירה את כתובת האימייל של המשתמש שמריץ את השאילתה. |
EVERY() |
הפונקציה מחזירה את הערך True אם הארגומנט נכון לכל ערכי הקלט שלו. |
FROM_BASE64() |
ממירה את מחרוזת הקלט שמקודדת ב-Base64 לפורמט BYTES. |
HASH() |
הפונקציה מחשבת ומחזירה ערך גיבוב (hash) עם סימן בן 64 ביט ... |
FARM_FINGERPRINT() |
הפונקציה מחשבת ומחזירה ערך טביעת אצבע עם סימן בן 64 ביט ... |
IF() |
אם הארגומנט הראשון הוא true, מחזירה את הארגומנט השני. אחרת, מחזירה את הארגומנט השלישי. |
POSITION() |
הפונקציה מחזירה את המיקום הרציף של הארגומנט, החל מ-1. |
SHA1() |
מחזירה גיבוב SHA1 בפורמט BYTES. |
SOME() |
הפונקציה מחזירה את הערך True אם הארגומנט נכון לפחות לאחד מערכי הקלט שלו. |
TO_BASE64() |
הפונקציה ממירה את הארגומנט BYTES למחרוזת בקידוד Base64. |
CASE WHEN when_expr1 THEN then_expr1
WHEN when_expr2 THEN then_expr2 ...
ELSE else_expr END- משתמשים ב-CASE כדי לבחור בין שני ביטויים חלופיים או יותר בשאילתה. הביטויים בתנאי WHEN צריכים להיות בוליאניים, וכל הביטויים בסעיפי THEN ובסעיף ELSE צריכים להיות מסוגים תואמים.
CURRENT_USER()- הפונקציה מחזירה את כתובת האימייל של המשתמש שמריץ את השאילתה.
EVERY(<condition>)- הפונקציה מחזירה את הערך
trueאםconditionנכון לכל ערכי הקלט שלה. כשמשתמשים בפונקציה הזו עם פסקהOMIT IF, היא שימושית לשאילתות שכוללות שדות חוזרים. FROM_BASE64(<str>)
- Converts the base64-encoded input string
strinto BYTES format. כדי להמיר BYTES למחרוזת בקידוד base64, משתמשים בפונקציה TO_BASE64(). HASH(expr)- מחשבת ומחזירה ערך גיבוב (hash) עם סימן בגודל 64 ביט של הבייטים של
expr, כפי שמוגדר בספריית CityHash (גרסה 1.0.3). הפונקציה תומכת בכל ביטוי של מחרוזת או מספר שלם, והיא מתייחסת ל-IGNORE CASEבמחרוזות, ומחזירה ערכים שלא תלויים באותיות רישיות או קטנות. FARM_FINGERPRINT(expr)
- מחשבת ומחזירה ערך חתימת אצבע חתום של 64 ביט של הקלט
STRINGאוBYTESבאמצעות הפונקציהFingerprint64מהספרייה FarmHash בקוד פתוח. הפלט של הפונקציה הזו עבור קלט מסוים אף פעם לא ישתנה, והוא זהה לפלט של הפונקציהFARM_FINGERPRINTכשמשתמשים ב-GoogleSQL. הפונקציה מתייחסת ל-IGNORE CASEבמחרוזות ומחזירה ערכים ללא תלות באותיות רישיות או קטנות. IF(condition, true_return, false_return)- הפונקציה מחזירה את הערך
true_returnאוfalse_return, בהתאם לערך שלcondition(true או false). הערכים המוחזרים יכולים להיות ערכים מילוליים או ערכים שנגזרים משדה, אבל הם צריכים להיות מאותו סוג נתונים. אין צורך לכלול את הערכים שנגזרים משדה מסוים בסעיףSELECT. POSITION(field)- מחזירה את המיקום העוקב של field בתוך קבוצה של שדות חוזרים, החל מ-1.
SHA1(<str>)
- מחזירה גיבוב (hash) מסוג SHA1 בפורמט BYTES של מחרוזת הקלט
str. אפשר להמיר את התוצאה ל-base64 באמצעות TO_BASE64(). לדוגמה:#legacySQL SELECT TO_BASE64(SHA1(corpus)) FROM [bigquery-public-data:samples.shakespeare] LIMIT 100;
SOME(<condition>)- הפונקציה מחזירה
trueאםconditionנכון לגבי לפחות אחד מערכי הקלט שלה. כשמשתמשים בפונקציה הזו עם פסקהOMIT IF, היא שימושית לשאילתות שכוללות שדות חוזרים. TO_BASE64(<bin_data>)
- ממירה את הקלט BYTES
bin_dataלמחרוזת בקידוד base64. לדוגמה: כדי להמיר מחרוזת בקידוד base64 ל-BYTES, משתמשים ב-FROM_BASE64().#legacySQL SELECT TO_BASE64(SHA1(title)) FROM [bigquery-public-data:samples.wikipedia] LIMIT 100;
דוגמאות מתקדמות
-
חלוקת התוצאות לקטגוריות באמצעות תנאים
בשילתתת הבאה נעשה שימוש בבלוק
CASE/WHENכדי לסווג את התוצאות לקטגוריות 'אזור' על סמך רשימה של מדינות. אם המדינה לא מופיעה כאפשרות באחד מהמשפטיםWHEN, ערך המדינה יהיה None כברירת מחדל.לדוגמה:
#legacySQL SELECT CASE WHEN state IN ('WA', 'OR', 'CA', 'AK', 'HI', 'ID', 'MT', 'WY', 'NV', 'UT', 'CO', 'AZ', 'NM') THEN 'West' WHEN state IN ('OK', 'TX', 'AR', 'LA', 'TN', 'MS', 'AL', 'KY', 'GA', 'FL', 'SC', 'NC', 'VA', 'WV', 'MD', 'DC', 'DE') THEN 'South' WHEN state IN ('ND', 'SD', 'NE', 'KS', 'MN', 'IA', 'MO', 'WI', 'IL', 'IN', 'MI', 'OH') THEN 'Midwest' WHEN state IN ('NY', 'PA', 'NJ', 'CT', 'RI', 'MA', 'VT', 'NH', 'ME') THEN 'Northeast' ELSE 'None' END as region, average_mother_age, average_father_age, state, year FROM (SELECT year, state, SUM(mother_age)/COUNT(mother_age) as average_mother_age, SUM(father_age)/COUNT(father_age) as average_father_age FROM [bigquery-public-data:samples.natality] WHERE father_age < 99 GROUP BY year, state) ORDER BY year LIMIT 5;
החזרות:
+--------+--------------------+--------------------+-------+------+ | region | average_mother_age | average_father_age | state | year | +--------+--------------------+--------------------+-------+------+ | South | 24.342600163532296 | 27.683769419460344 | AR | 1969 | | West | 25.185041908446163 | 28.268214055448098 | AK | 1969 | | West | 24.780776677578217 | 27.831181063905248 | CA | 1969 | | West | 25.005834769924412 | 27.942978384829598 | AZ | 1969 | | South | 24.541730952905738 | 27.686430093306885 | AL | 1969 | +--------+--------------------+--------------------+-------+------+
-
סימולציה של טבלת צירים
אפשר להשתמש במשפטי תנאי כדי לארגן את התוצאות של שאילתת בחירה משנית בשורות ובעמודות. בדוגמה שלמטה, התוצאות של חיפוש המאמרים בוויקיפדיה שעברו הכי הרבה שינויים ומתחילים בערך Google, מסודרות בעמודות שבהן מוצגים מספרי השינויים אם הם עומדים בקריטריונים שונים.
לדוגמה:
#legacySQL SELECT page_title, /* Populate these columns as True or False, */ /* depending on the condition */ IF (page_title CONTAINS 'search', INTEGER(total), 0) AS search, IF (page_title CONTAINS 'Earth' OR page_title CONTAINS 'Maps', INTEGER(total), 0) AS geo, FROM /* Subselect to return top revised Wikipedia articles */ /* containing 'Google', followed by additional text. */ (SELECT TOP (title, 5) as page_title, COUNT (*) as total FROM [bigquery-public-data:samples.wikipedia] WHERE REGEXP_MATCH (title, r'^Google.+') AND wp_namespace = 0 );
החזרות:
+---------------+--------+------+ | page_title | search | geo | +---------------+--------+------+ | Google search | 4261 | 0 | | Google Earth | 0 | 3874 | | Google Chrome | 0 | 0 | | Google Maps | 0 | 2617 | | Google bomb | 0 | 0 | +---------------+--------+------+
-
שימוש ב-HASH כדי לבחור מדגם אקראי של הנתונים
חלק מהשאילתות יכולות לספק תוצאה שימושית באמצעות דגימת משנה אקראית של מערך התוצאות. כדי לאחזר מדגם אקראי של ערכים, משתמשים בפונקציה
HASHכדי להחזיר תוצאות שבהן המודולו n של הגיבוב שווה לאפס.לדוגמה, השאילתה הבאה תמצא את
HASH()של הערך title, ואז תבדוק אם הערך הזה מודולו 2 הוא אפס. התוצאה של הפעולה הזו צריכה להיות ש-50% מהערכים מסומנים כ'נדגמו'. כדי לדגום פחות ערכים, מגדילים את הערך של פעולת המודולו מ-2 לערך גדול יותר. השאילתה משתמשת בפונקציהABSבשילוב עםHASH, כיHASHיכולה להחזיר ערכים שליליים, ואופרטור המודולו על ערך שלילי מחזיר ערך שלילי.לדוגמה:
#legacySQL SELECT title, HASH(title) AS hash_value, IF(ABS(HASH(title)) % 2 == 1, 'True', 'False') AS included_in_sample FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 5;