תחביר, פונקציות ואופרטורים של 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;
טבלאות מחולקות למחיצות לפי טווח של מספרים שלמים
ב-SQL מדור קודם אפשר להשתמש במעצבי טבלאות כדי לפנות למחיצה ספציפית בטבלה שמחולקת לפי טווח של מספרים שלמים. המפתח לכתובת של מחיצת טווח הוא תחילת הטווח.
בדוגמה הבאה, השאילתה מתבצעת על מחיצת הטווח שמתחילה ב-30:
#legacySQL SELECT * FROM dataset.table$30;
שימו לב שאי אפשר להשתמש ב-SQL מדור קודם כדי לשלוח שאילתות על טבלה מחולקת למחיצות (Partitions) שלמה שמחולקת לפי טווח של מספרים שלמים. במקום זאת, השאילתה מחזירה שגיאה כמו זו:
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.
בפעולות CROSS JOIN אי אפשר להשתמש בסעיפי ON. הפונקציה 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-grams שבהם המילה הראשונה ב-n-gram היא גם המילה השנייה ב-n-gram אחר, שבו המילה השלישית ב-n-gram היא "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 לא תומך ב-semi-join או ב-anti-semi-join מקושרים. שאילתת המשנה לא יכולה להפנות לשדות כלשהם מהשאילתה החיצונית.
- בשאילתת המשנה שמשמשת ב-semi-join או ב-anti-semi-join צריך לבחור שדה אחד בדיוק.
-
סוגי השדה שנבחר והשדה שנעשה בו שימוש מהשאילתה החיצונית בסעיף
WHEREחייבים להיות זהים. BigQuery לא יבצע המרת סוגים (type coercion) עבור semi-join או anti-semi-join.
סעיף WHERE
הסעיף WHERE, שלפעמים נקרא פרדיקט, מסנן רשומות שנוצרו על ידי הסעיף 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');
סעיף OMIT RECORD 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במקוםGROUP BYעשוי לפתור חלק מהבעיות שקשורות לשינוי קנה המידה.
סעיף HAVING
הסעיף HAVING פועל בדיוק כמו הסעיף WHERE, אבל הוא מוערך אחרי הסעיף SELECT, כך שהתוצאות של כל הביטויים המחושבים גלויות לסעיף HAVING. הסעיף HAVING יכול להתייחס רק לפלט של הסעיף SELECT התואם.
דוגמה
השאילתה הזו מחשבת את המילים הראשונות הנפוצות ביותר בקבוצת הנתונים לדוגמה של ngram, שמכילות את האות 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
הסעיף 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 }
thought סימון:
- סוגריים מרובעים "[ ]" מציינים סעיפים אופציונליים.
- סוגריים מסולסלים "{ }" תוחמים קבוצה של אפשרויות.
- הקו האנכי "|" מציין את האופרטור הלוגי OR.
- פסיק או מילת מפתח שאחריהם מופיעות שלוש נקודות בתוך סוגריים מרובעים "[, ... ]" מציינים שהפריט הקודם יכול לחזור על עצמו ברשימה עם התו המפריד שצוין.
- סוגריים "( )" מציינים סוגריים מילוליים.
הפונקציות והאופרטורים שנתמכים
רוב הסעיפים של משפטי SELECT תומכים בפונקציות. לא צריך לציין שדות שמופיעים בפונקציה בסעיף SELECT כלשהו. לכן, השאילתה הבאה תקינה, למרות שהשדה 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 ברמת הביט |
| |
Bitwise OR |
^ |
XOR ברמת הביט |
<< |
הזזה שמאלה ברמת הביט |
>> |
הזזה ימינה ברמת הביט |
~ |
NOT ברמת הביט |
BIT_COUNT() |
הפונקציה מחזירה את מספר הביטים ... |
| פונקציות המרה | |
|---|---|
BOOLEAN() |
המרה לערך בוליאני. |
BYTES() |
המרה לבייטים. |
CAST(expr AS type) |
הפונקציה ממירה את expr למשתנה מסוג type. |
FLOAT() |
המרה ל-double. |
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() |
מחזירה את השעה של TIMESTAMP כמספר שלם בין 0 ל-23. |
MINUTE() |
הפונקציה מחזירה את הדקות של TIMESTAMP כמספר שלם בין 0 ל-59. |
MONTH() |
הפונקציה מחזירה את החודש של TIMESTAMP כמספר שלם בין 1 ל-12. |
MSEC_TO_TIMESTAMP() |
ממירה חותמת זמן של UNIX באלפיות השנייה ל-TIMESTAMP. |
NOW() |
הפונקציה מחזירה את חותמת הזמן הנוכחית של מערכת UNIX במיקרו-שניות. |
PARSE_UTC_USEC() |
הפונקציה ממירה מחרוזת תאריך לחותמת זמן של UNIX במיקרו-שניות. |
QUARTER() |
הפונקציה מחזירה את הרבעון בשנה של TIMESTAMP כמספר שלם בין 1 ל-4. |
SEC_TO_TIMESTAMP() |
ממירה חותמת זמן של UNIX בשניות ל-TIMESTAMP. |
SECOND() |
הפונקציה מחזירה את השניות של TIMESTAMP כמספר שלם בין 0 ל-59. |
STRFTIME_UTC_USEC() |
הפונקציה מחזירה מחרוזת תאריך בפורמט date_format_str. |
TIME() |
מחזירה TIMESTAMP בפורמט %H:%M:%S. |
TIMESTAMP() |
המרת מחרוזת תאריך ל-TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
הפונקציה ממירה TIMESTAMP לחותמת זמן של UNIX באלפיות השנייה. |
TIMESTAMP_TO_SEC() |
ממירה TIMESTAMP לחותמת זמן של UNIX בשניות. |
TIMESTAMP_TO_USEC() |
הפונקציה ממירה TIMESTAMP לחותמת זמן של UNIX במיקרו-שניות. |
USEC_TO_TIMESTAMP() |
ממירה חותמת זמן של UNIX במיקרו-שניות ל-TIMESTAMP. |
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() |
הפונקציה מחזירה את השבוע של TIMESTAMP כמספר שלם בין 1 ל-53. |
YEAR() |
מחזירה את השנה של TIMESTAMP. |
| פונקציות 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() |
מחזירה ערך אקראי מסוג מספר ממשי (float) בטווח 0.0 <= ערך < 1.0. |
ROUND() |
מעגלת את הארגומנט למעלה או למטה למספר השלם הקרוב ביותר. |
SIN() |
מחזירה את הסינוס של הארגומנט. |
SINH() |
מחזירה את הסינוס ההיפרבולי של הארגומנט. |
SQRT() |
מחזירה את השורש הריבועי של הביטוי. |
TAN() |
מחזירה את הטנגנס של הארגומנט. |
TANH() |
מחזירה את הטנגנס ההיפרבולי של הארגומנט. |
| פונקציות של ביטויים רגולריים | |
|---|---|
REGEXP_MATCH() |
הפונקציה מחזירה את הערך True אם הארגומנט תואם לביטוי הרגולרי. |
REGEXP_EXTRACT() |
הפונקציה מחזירה את החלק של הארגומנט שתואם לקבוצה לחילוץ בתוך הביטוי הרגולרי. |
REGEXP_REPLACE() |
החלפת מחרוזת משנה שתואמת לביטוי רגולרי. |
| פונקציות של מחרוזות | |
|---|---|
CONCAT() |
הפונקציה מחזירה את השרשור של שתי מחרוזות או יותר, או NULL אם אחד מהערכים הוא NULL. |
expr CONTAINS 'str' |
הפונקציה מחזירה את הערך true אם expr מכיל את ארגומנט המחרוזת שצוין. |
INSTR() |
הפונקציה מחזירה את האינדקס מבוסס-האחד של המופע הראשון של מחרוזת. |
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. |
| פונקציות אנליטיות (window functions) | |
|---|---|
AVG()COUNT(*)COUNT([DISTINCT])MAX()MIN()STDDEV()SUM() |
אותה פעולה כמו פונקציות הצבירה התואמות, אבל החישוב מתבצע בחלון שמוגדר על ידי משפט OVER. |
CUME_DIST() |
הפונקציה מחזירה ערך מסוג double שמציין את ההתפלגות המצטברת של ערך בקבוצת ערכים ... |
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() |
ממירה את מחרוזת הקלט בקידוד base-64 לפורמט BYTES. |
HASH() |
מחשבת ומחזירה ערך גיבוב (hash) חתום של 64 ביט ... |
FARM_FINGERPRINT() |
מחשבת ומחזירה ערך טביעת אצבע חתום של 64 ביט ... |
IF() |
אם הארגומנט הראשון נכון, הפונקציה מחזירה את הארגומנט השני. אחרת, היא מחזירה את הארגומנט השלישי. |
POSITION() |
הפונקציה מחזירה את המיקום הסידורי של הארגומנט, החל מ-1. |
SHA1() |
הפונקציה מחזירה גיבוב (hash) של 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יפחיתו את יכולת ההתאמה לעומס (scalability) של האופרטור הזה, ועלולים להאריך באופן משמעותי את זמן הביצוע של השאילתה או לגרום לה להיכשל.כדי לחשב את המספר המדויק של ערכים נפרדים, משתמשים בפונקציה 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 בשדה שצוין. כדי לשפר את יכולת ההתאמה לעומס (scalability) ואת הביצועים, השתמשו ב-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)- הפונקציה מחזירה את הערך המינימלי בהיקף שלה.
NEST(expr)-
צובר את כל הערכים בהיקף הצבירה הנוכחי לשדה חוזר. לדוגמה, השאילתה
"SELECT x, NEST(y) FROM ... GROUP BY x"מחזירה רשומת פלט אחת לכל ערךxנפרד, ומכילה שדה חוזר לכל ערכיyשמשויכים ל-xבקלט של השאילתה. הפונקציהNESTדורשת סעיףGROUP BY.BigQuery משטח באופן אוטומטי את תוצאות השאילתה, כך שאם משתמשים בפונקציה
NESTבשאילתה ברמה העליונה, התוצאות לא יכילו שדות חוזרים. משתמשים בפונקציהNESTכשמשתמשים ב-subselect שמפיק תוצאות ביניים לשימוש מיידי באותה שאילתה. NTH(n, field)
- מחזירה את הערך העוקב ה-
nבהיקף הפונקציה, כאשרnהוא קבוע. הפונקציהNTHמתחילה לספור מ-1, כך שאין איבר אפס. אם בהיקף הפונקציה יש פחות מ-nערכים, הפונקציה מחזירה את הערךNULL. QUANTILES(expr[, buckets])-
מחשב את הערכים המשוערים של המינימום, המקסימום והאחוזונים של ביטוי הקלט. המערכת מתעלמת מערכי קלט של
NULL. קלט ריק או קלט שמכיל רקNULLיגרום לפלט שלNULL. מספר האחוזונים המחושבים נשלט על ידי הפרמטר האופציונליbuckets, שכולל את המינימום והמקסימום בספירה. כדי לחשב N-tiles משוערים, משתמשים ב-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))מעריך את האחוזון ה-95 שלexpr. בשני האומדנים יש מרווח טעות של 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. פרטים נוספים מופיעים בתיאור של TOP בהמשך.
UNIQUE(expr)- הפונקציה מחזירה את קבוצת הערכים הייחודיים שאינם NULL בהיקף הפונקציה, בסדר לא מוגדר. בדומה לסעיף
GROUP BYגדול בלי מילת המפתחEACH, השאילתה תיכשל עם השגיאה "Resources Exceeded" אם יש יותר מדי ערכים נפרדים. עם זאת, בניגוד ל-GROUP BY, אפשר להחיל את הפונקציהUNIQUEעם צבירה ברמת ההיקף, וכך לבצע פעולה יעילה בשדות בתצוגת עץ עם מספר מוגבל של ערכים. VARIANCE(numeric_expr)- מחשבת את השונות של הערכים שחושבו על ידי
numeric_expr. שורות עם ערך NULL לא נכללות בחישוב. הפונקציהVARIANCEהיא כינוי שלVAR_SAMP. VAR_POP(numeric_expr)- מחשבת את השונות של האוכלוסייה של הערכים שמחושבים על ידי
numeric_expr. מידע נוסף על סטיית תקן של אוכלוסייה לעומת סטיית תקן של מדגם זמין במאמר סטיית תקן בוויקיפדיה. VAR_SAMP(numeric_expr)- מחשבת את השונות של המדגם של הערכים שחושבו על ידי
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 |
| | | Bitwise OR |
התוצאה: 28 |
| ^ | XOR ברמת הביט |
הפונקציה מחזירה: 1 |
| << | הזזה שמאלה ברמת הביט |
הפונקציה מחזירה: 16 |
| >> | הזזה ימינה ברמת הביט |
הפונקציה מחזירה: 2 |
| ~ | NOT ברמת הביט |
התוצאה: -3 |
BIT_COUNT(<numeric_expr>) |
הפונקציה מחזירה את מספר הביטים שמוגדרים ב- |
החזרות: 4 |
פונקציות המרה
פונקציות המרה משנות את סוג הנתונים של ביטוי מספרי. פונקציות המרה שימושיות במיוחד כדי לוודא שהארגומנטים בפונקציית השוואה הם מאותו סוג נתונים.
תחביר
| פונקציות המרה | |
|---|---|
BOOLEAN() |
המרה לערך בוליאני. |
BYTES() |
המרה לבייטים. |
CAST(expr AS type) |
הפונקציה ממירה את expr למשתנה מסוג type. |
FLOAT() |
המרה ל-double. |
HEX_STRING() |
המרה למחרוזת הקסדצימלית. |
INTEGER() |
המרה למספר שלם. |
STRING() |
המרה למחרוזת. |
BOOLEAN(<numeric_expr>)-
- הפונקציה מחזירה את הערך
trueאם הערך של<numeric_expr>הוא לא 0 ולא NULL. - הפונקציה מחזירה את הערך
falseאם הערך של<numeric_expr>הוא 0. - הפונקציה מחזירה את הערך
NULLאם הערך של<numeric_expr>הוא NULL.
- הפונקציה מחזירה את הערך
BYTES(string_expr)- הפונקציה מחזירה את
string_exprכערך מסוגbytes. CAST(expr AS type)- הפונקציה ממירה את
exprלמשתנה מסוגtype. FLOAT(expr)-
הפונקציה מחזירה את
exprבתור מספר מסוג double. הפרמטרexprיכול להיות מחרוזת כמו'45.78', אבל הפונקציה מחזירהNULLלערכים לא מספריים. HEX_STRING(numeric_expr)
- הפונקציה מחזירה את
numeric_exprכמחרוזת הקסדצימלית. INTEGER(expr)-
ממירה את
exprלמספר שלם של 64 ביט.- הפונקציה מחזירה NULL אם
exprהוא מחרוזת שלא תואמת לערך של מספר שלם. - הפונקציה מחזירה את מספר המיקרו-שניות מאז ראשית זמן יוניקס (Unix epoch) אם
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
- הפונקציה מחזירה את הערך
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(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)- אם הערך של
exprהוא לא null, הפונקציה מחזירה אתexpr, אחרת היא מחזירה אתnull_default. IS_INF(numeric_expr)- הפונקציה מחזירה את הערך
trueאם הערך שלnumeric_exprהוא אינסוף חיובי או שלילי. 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)- אם הערך של
exprהוא לא null, הפונקציה מחזירה אתexpr, אחרת היא מחזירה אתnull_default. הפונקציהNVLהיא כינוי שלIFNULL.
פונקציות של תאריך ושעה
הפונקציות הבאות מאפשרות לבצע פעולות על תאריכים ושעות בחותמות זמן של UNIX, במחרוזות של תאריכים ובסוגי נתונים של TIMESTAMP. למידע נוסף על עבודה עם סוג הנתונים TIMESTAMP, קראו את המאמר שימוש ב-TIMESTAMP.
פונקציות של תאריך ושעה שעובדות עם חותמות זמן של 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() |
מחזירה את השעה של TIMESTAMP כמספר שלם בין 0 ל-23. |
MINUTE() |
הפונקציה מחזירה את הדקות של TIMESTAMP כמספר שלם בין 0 ל-59. |
MONTH() |
הפונקציה מחזירה את החודש של TIMESTAMP כמספר שלם בין 1 ל-12. |
MSEC_TO_TIMESTAMP() |
ממירה חותמת זמן של UNIX באלפיות השנייה ל-TIMESTAMP. |
NOW() |
הפונקציה מחזירה את חותמת הזמן הנוכחית של מערכת UNIX במיקרו-שניות. |
PARSE_UTC_USEC() |
הפונקציה ממירה מחרוזת תאריך לחותמת זמן של UNIX במיקרו-שניות. |
QUARTER() |
הפונקציה מחזירה את הרבעון בשנה של TIMESTAMP כמספר שלם בין 1 ל-4. |
SEC_TO_TIMESTAMP() |
ממירה חותמת זמן של UNIX בשניות ל-TIMESTAMP. |
SECOND() |
הפונקציה מחזירה את השניות של TIMESTAMP כמספר שלם בין 0 ל-59. |
STRFTIME_UTC_USEC() |
הפונקציה מחזירה מחרוזת תאריך בפורמט date_format_str. |
TIME() |
מחזירה TIMESTAMP בפורמט %H:%M:%S. |
TIMESTAMP() |
המרת מחרוזת תאריך ל-TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
הפונקציה ממירה TIMESTAMP לחותמת זמן של UNIX באלפיות השנייה. |
TIMESTAMP_TO_SEC() |
ממירה TIMESTAMP לחותמת זמן של UNIX בשניות. |
TIMESTAMP_TO_USEC() |
הפונקציה ממירה TIMESTAMP לחותמת זמן של UNIX במיקרו-שניות. |
USEC_TO_TIMESTAMP() |
ממירה חותמת זמן של UNIX במיקרו-שניות ל-TIMESTAMP. |
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() |
הפונקציה מחזירה את השבוע של TIMESTAMP כמספר שלם בין 1 ל-53. |
YEAR() |
מחזירה את השנה של TIMESTAMP. |
CURRENT_DATE()הפונקציה מחזירה מחרוזת קריאה לאנשים של התאריך הנוכחי בפורמט
%Y-%m-%d.לדוגמה:
SELECT CURRENT_DATE();הפונקציה מחזירה: 2013-02-01
CURRENT_TIME()הפונקציה מחזירה מחרוזת קריאה לאנשים של השעה הנוכחית בשרת בפורמט
%H:%M:%S.לדוגמה:
SELECT CURRENT_TIME();הפונקציה מחזירה: 01:32:56
CURRENT_TIMESTAMP()מחזירה סוג נתונים של 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. התוצאה חיובית אם סוג הנתונים הראשון של TIMESTAMP מגיע אחרי סוג הנתונים השני של 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 באלפיות השנייה לסוג הנתונים TIMESTAMP.
לדוגמה:
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 במיקרו-שניות. הפורמט של
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 בשניות לסוג נתונים TIMESTAMP.
לדוגמה:
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>)הפונקציה ממירה סוג נתונים של TIMESTAMP לחותמת זמן של UNIX באלפיות השנייה.
לדוגמה:
SELECT TIMESTAMP_TO_MSEC(TIMESTAMP("2012-10-01 01:02:03"));הפונקציה מחזירה: 1349053323000
TIMESTAMP_TO_SEC(<timestamp>)- הפונקציה ממירה את סוג הנתונים TIMESTAMP לחותמת זמן של UNIX בשניות.
לדוגמה:
SELECT TIMESTAMP_TO_SEC(TIMESTAMP("2012-10-01 01:02:03"));התוצאה: 1349053323
TIMESTAMP_TO_USEC(<timestamp>)-
הפונקציה ממירה סוג נתונים של TIMESTAMP לחותמת זמן של UNIX במיקרו-שניות.
PARSE_UTC_USEC היא פונקציה מקבילה שממירה ארגומנט של מחרוזת נתונים במקום סוג נתונים של TIMESTAMP.
לדוגמה:
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חל ביום שישי, 11.4.2008, והגדרתם אתday_of_weekל-2 (יום שלישי), הפונקציה מחזירה חותמת זמן של UNIX ליום שלישי, 8.4.2008.לדוגמה:
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 | |
|---|---|
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)
- ממירה 32 ביטים פחות משמעותיים של
integer_valueלמחרוזת של כתובת IPv4 שקריאה לאנשים. לדוגמה,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לפי הביטויjson_pathשל JSONPath. json_pathחייב להיות קבוע של מחרוזת. הפונקציה מחזירה את הערך בפורמט מחרוזת JSON. JSON_EXTRACT_SCALAR(json, json_path)-
בוחר ערך ב-
jsonלפי הביטויjson_pathשל JSONPath. 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אם אחד מהביטויים או שניהם לא נכונים. - הפונקציה מחזירה את הערך
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() |
מחזירה ערך אקראי מסוג מספר ממשי (float) בטווח 0.0 <= ערך < 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)- הפונקציה מחזירה את הערך
numeric_expr, אחרי המרה מרדיאנים למעלות. 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)- הפונקציה מחזירה את התוצאה של העלאת
numeric_expr1בחזקתnumeric_expr2. RADIANS(numeric_expr)
- הפונקציה מחזירה את הערך
numeric_expr, אחרי המרה ממעלות לרדיאנים. (שימו לב ש-π רדיאנים שווה ל-180 מעלות). RAND([int32_seed])
- הפונקציה מחזירה ערך אקראי מסוג float בטווח 0.0 <= value < 1.0. כל ערך של
int32_seedתמיד יוצר את אותו רצף של מספרים אקראיים בשאילתה נתונה, כל עוד לא משתמשים בסעיףLIMIT. אם לא מציינים אתint32_seed, BigQuery משתמש בחותמת הזמן הנוכחית כערך הבסיס. ROUND(numeric_expr [, digits])- הפונקציה מעגלת את הארגומנט כלפי מעלה או כלפי מטה למספר השלם הקרוב ביותר (או למספר הספרות שצוין, אם צוין) ומחזירה את הערך המעוגל.
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() |
הפונקציה מחזירה את האינדקס מבוסס-האחד של המופע הראשון של מחרוזת. |
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')- הפונקציה מחזירה את האינדקס מבוסס-האחד של המופע הראשון של 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')- מוסיף ריפוד ל-
str1משמאל באמצעותstr2, וחוזר עלstr2עד שמחרוזת התוצאה היא באורך שלnumeric_exprתווים בדיוק. דוגמה:LPAD('1', 7, '?')מחזיר את הערך??????1. LTRIM('str1' [, str2])-
מסירה תווים מהצד השמאלי של str1. אם משמיטים את str2, הפונקציה
LTRIMמסירה רווחים מהצד השמאלי של str1. אחרת, הפונקציהLTRIMמסירה את כל התווים ב-str2 מהצד השמאלי של str1 (תלוי אותיות רישיות).לדוגמה:
הפונקציה
SELECT LTRIM("Say hello", "yaS")מחזירה את הערך" hello".הפונקציה
SELECT LTRIM("Say hello", " ySa")מחזירה את הערך"hello". REPLACE('str1', 'str2', 'str3')-
הפונקציה מחליפה את כל המופעים של str2 בתוך str1 ב-str3.
RIGHT('str', numeric_expr)
- מחזירה את התווים הימניים ביותר של numeric_expr ב-
str. אם המספר ארוך יותר מהמחרוזת, הפונקציה תחזיר את כל המחרוזת. דוגמה:RIGHT('kirkland', 4)מחזיר את הערךland. RPAD('str1', numeric_expr, 'str2')- מוסיף ריפוד ל-
str1מימין באמצעותstr2, וחוזר עלstr2עד שמחרוזת התוצאה היא באורך שלnumeric_exprתווים בדיוק. דוגמה:RPAD('1', 7, '?')מחזיר את הערך1??????. RTRIM('str1' [, str2])-
מסירה תווים נגררים מהצד הימני של str1. אם משמיטים את str2, הפונקציה
RTRIMמסירה רווחים בסוף של str1. אחרת, הפונקציהRTRIMמסירה את כל התווים ב-str2 מהצד הימני של str1 (תלוי אותיות רישיות).לדוגמה:
הפונקציה
SELECT RTRIM("Say hello", "leo")מחזירה את הערך"Say h".הפונקציה
SELECT RTRIM("Say hello ", " hloe")מחזירה את הערך"Say". SPLIT('str' [, 'delimiter'])- פיצול מחרוזת למחרוזות משנה חוזרות. אם מציינים את
delimiter, הפונקציהSPLITמפצלת אתstrלמחרוזות משנה, ומשתמשת ב-delimiterבתור התו המפריד. SUBSTR('str', index [, max_len])- הפונקציה מחזירה מחרוזת משנה של
str, החל מ-index. אם משתמשים בפרמטר האופציונליmax_len, המחרוזת שמוחזרת היא באורך שלmax_lenתווים לכל היותר. הספירה מתחילה מ-1, כך שהתו הראשון במחרוזת נמצא במיקום 1 (ולא אפס). אםindexהוא5, מחרוזת המשנה מתחילה בתו החמישי משמאל ב-str. אם הערך שלindexהוא-4, מחרוזת המשנה מתחילה בתו הרביעי מימין ב-str. לדוגמה: הפונקציהSUBSTR('awesome', -4, 4)מחזירה את המחרוזת המשניתsome. UPPER('str')
- הפונקציה מחזירה את המחרוזת המקורית כשכל התווים הם אותיות רישיות.
סימון בתווי בריחה (escape) של תווים מיוחדים במחרוזות
כדי להוסיף תווי בריחה לתווים מיוחדים, אפשר להשתמש באחת מהשיטות הבאות:
- משתמשים בסימון
'\xDD', שבו אחרי'\x'מופיע הייצוג ההקסדצימלי הדו-ספרתי של התו. - צריך להשתמש בלוכסן מילוט לפני לוכסנים, מירכאות בודדות ומירכאות כפולות.
- לתווים אחרים, צריך להשתמש ברצפים בסגנון C (
'\a', '\b', '\f', '\n', '\r', '\t',ו-'\v').
דוגמאות לתווי בריחה:
'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
פונקציות של תווים כלליים לחיפוש בטבלאות
פונקציות של תו כללי לחיפוש בטבלאות הן דרך נוחה לשלוח שאילתות על נתונים מקבוצה ספציפית של טבלאות. פונקציית תו כללי לחיפוש בטבלאות מקבילה לאיחוד של כל הטבלאות שתואמות לפונקציית התו הכללי לחיפוש, כשהן מופרדות בפסיקים. כשמשתמשים בפונקציה של תו כללי לחיפוש בטבלאות, BigQuery ניגש רק לטבלאות שתואמות לתו הכללי לחיפוש, ומחייב רק עליהן. פונקציות של תו כללי לחיפוש בטבלאות מצוינות בסעיף FROM של השאילתה.
אם אתם משתמשים בפונקציות של תו כללי לחיפוש בטבלאות בשאילתה, כבר לא צריך להכיל את הפונקציות בסוגריים. לדוגמה, בחלק מהדוגמאות הבאות יש סוגריים, ובחלק אין.
לא ניתן להשתמש בתו כללי לחיפוש כדי להריץ שאילתות על מספר טבלאות לגבי תוצאות במטמון (גם אם סימנתם את האפשרות Use Cached Results). אם תפעילו כמה פעמים את אותה שאילתה עם תו כללי לחיפוש, תחויבו על כל שאילתה.
תחביר
| פונקציות של תווים כלליים לחיפוש בטבלאות | |
|---|---|
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
הדוגמה שלמעלה מחזירה את השגיאה "Not Found" לטבלה "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) שלא נמצאים ברשימה של דוגמאות נפוצות.
#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 functions)
פונקציות אנליטיות (window functions) מאפשרות לבצע חישובים בקבוצת משנה ספציפית, או "חלון", של קבוצת תוצאות. פונקציות אנליטיות מקלות על יצירת דוחות שכוללים ניתוחים מורכבים, כמו ממוצעים נעים וסכומים מצטברים.
כל פונקציה אנליטית דורשת משפט OVER שמציין את החלק העליון והתחתון של החלון. שלושת הרכיבים של משפט OVER (חלוקה למחיצות, סידור ומיסגור) מספקים שליטה נוספת על החלון. חלוקה למחיצות מאפשרת לחלק את נתוני הקלט לקבוצות לוגיות עם מאפיין משותף. הסדר מאפשר לכם לסדר את התוצאות בתוך מחיצה. הגדרת מסגרת מאפשרת ליצור מסגרת של חלון הזזה בתוך מחיצה, שזזה ביחס לשורה הנוכחית. אפשר להגדיר את גודל מסגרת החלון הנע על סמך מספר שורות או טווח ערכים, כמו מרווח זמן.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY- מגדיר את המחיצה הבסיסית שעליה הפונקציה הזו פועלת.
מציינים שם אחד או יותר של עמודה, מופרדים בפסיקים. תיווצר מחיצה אחת לכל קבוצה נפרדת של ערכים בעמודות האלה, בדומה לסעיף
GROUP BY. אם משמיטים אתPARTITION BY, המחיצה הבסיסית היא כל השורות בקלט של הפונקציה האנליטית. - הסעיף
PARTITION BYמאפשר גם לפונקציות אנליטיות (window functions) לחלק את הנתונים למחיצות ולהריץ את השאילתה במקביל. אם רוצים להשתמש בפונקציה אנליטית עם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 | +------+-------+---------------+
תחביר
| פונקציות אנליטיות (window functions) | |
|---|---|
AVG()COUNT(*)COUNT([DISTINCT])MAX()MIN()STDDEV()SUM() |
אותה פעולה כמו פונקציות הצבירה התואמות, אבל החישוב מתבצע בחלון שמוגדר על ידי משפט OVER. |
CUME_DIST() |
הפונקציה מחזירה ערך מסוג double שמציין את ההתפלגות המצטברת של ערך בקבוצת ערכים ... |
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)מפיקה תוצאות מדויקות כשמשתמשים בה כפונקציה אנליטית, עם התנהגות דומה לפונקציית הצבירה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>. ערכים זהים מחזירים את אותו ערך של התפלגות מצטברת.הפונקציה האנליטית הזו דורשת
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().
הפונקציה האנליטית הזו דורשת
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>הוא אינדקס שמתחיל בספרה אחת. 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.
הפונקציה האנליטית הזו דורשת
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.הפונקציה האנליטית הזו דורשת
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.הפונקציה האנליטית הזו דורשת
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().
הפונקציה האנליטית הזו דורשת
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>)-
הפונקציה מחזירה את היחס בין כל ערך לסכום הערכים, כערך מסוג double בין 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() |
ממירה את מחרוזת הקלט בקידוד base-64 לפורמט BYTES. |
HASH() |
מחשבת ומחזירה ערך גיבוב (hash) חתום של 64 ביט ... |
FARM_FINGERPRINT() |
מחשבת ומחזירה ערך טביעת אצבע חתום של 64 ביט ... |
IF() |
אם הארגומנט הראשון נכון, הפונקציה מחזירה את הארגומנט השני. אחרת, היא מחזירה את הארגומנט השלישי. |
POSITION() |
הפונקציה מחזירה את המיקום הסידורי של הארגומנט, החל מ-1. |
SHA1() |
הפונקציה מחזירה גיבוב (hash) של 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>)- הפונקציה ממירה את מחרוזת הקלט
strבקידוד base64 לפורמט BYTES. כדי להמיר 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(נכון או לא נכון). ערכי ההחזרה יכולים להיות ערכים מילוליים או ערכים שנגזרים משדות, אבל הם חייבים להיות מאותו סוג נתונים. אין צורך לכלול ערכים שנגזרים משדות בסעיף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>)- הפונקציה ממירה את הקלט
bin_dataמסוג BYTES למחרוזת בקידוד 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יכולה להחזיר ערכים שליליים, והאופרטור modulo בערך שלילי מניב ערך שלילי.לדוגמה:
#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;