הדף הזה מתייחס לפרמטר
typeשהוא חלק ממדד.אפשר להשתמש ב-
typeגם כחלק ממאפיין או ממסנן, כפי שמתואר בדף התיעוד סוגי מאפיינים, מסננים ופרמטרים.אפשר להשתמש ב-
typeגם כחלק מקבוצת מאפיינים, כמו שמתואר בדף התיעוד של הפרמטרdimension_group.
Usage
view: view_name {
measure: field_name {
type: measure_field_type
}
}
|
היררכיה
type |
סוגי שדות אפשריים
מדידה
מקבל
סוג מדידה
|
בדף הזה מפורטים הסוגים השונים שאפשר להקצות למדד. למדד יכול להיות רק סוג אחד, וברירת המחדל היא string אם לא צוין סוג.
לחלק מסוגי המדדים יש פרמטרים תומכים, שמתוארים בקטע המתאים.
קטגוריות של סוגי מדידה
כל סוג של אמצעי נכלל באחת מהקטגוריות הבאות. הקטגוריות האלה קובעות אם סוג המדד מבצע צבירות, את סוג השדות שסוג המדד יכול להפנות אליהם, ואם אפשר לסנן את סוג המדד באמצעות הפרמטר filters:
- מדדים מצטברים: סוגי מדדים מצטברים מבצעים צבירות, כמו
sumו-average. מדדים מצטברים יכולים להפנות רק למאפיינים, ולא למדדים אחרים. זהו סוג המדידה היחיד שפועל עם הפרמטרfilters. - מדדים לא נצברים: מדדים לא נצברים הם, כפי שהשם מרמז, סוגי מדדים שלא מבצעים צבירות, כמו
numberו-yesno. סוגי המדדים האלה מבצעים טרנספורמציות בסיסיות, ומכיוון שהם לא מבצעים צבירות, הם יכולים להפנות רק למדדים נצברים או למאפיינים שנצברו בעבר. אי אפשר להשתמש בפרמטרfiltersעם סוגי המדדים האלה. - מדדי Post-SQL: מדדי Post-SQL הם סוגים מיוחדים של מדדים שמבצעים חישובים ספציפיים אחרי ש-Looker יצר את שאילתת ה-SQL. הם יכולים להפנות רק למדדים מספריים או למאפיינים מספריים. אי אפשר להשתמש בפרמטר
filtersעם סוגי המדידה האלה.
רשימה של הגדרות סוג
| סוג | קטגוריה | תיאור |
|---|---|---|
average |
צבירה | יוצרת ממוצע של ערכים בעמודה |
average_distinct |
צבירה | מחשב בצורה נכונה את הממוצע של הערכים כשמשתמשים בנתונים לא מנורמלים. תיאור מלא מופיע בקטע average_distinct. |
count |
צבירה | יוצרת ספירה של שורות |
count_distinct |
צבירה | סופרת את הערכים הייחודיים בעמודה |
date |
לא מצטבר | למדדים שמכילים תאריכים |
list |
צבירה | יצירת רשימה של הערכים הייחודיים בעמודה |
max |
צבירה | יצירת הערך המקסימלי בעמודה |
median |
צבירה | יוצרת את החציון (ערך נקודת האמצע) של הערכים בעמודה |
median_distinct |
צבירה | יוצרת חציון (ערך אמצעי) של הערכים בצורה נכונה כשפעולת צירוף גורמת להתרחבות. תיאור מלא מופיע בקטע median_distinct. |
min |
צבירה | יצירת הערך המינימלי בעמודה |
number |
לא מצטבר | למדדים שמכילים מספרים |
percent_of_previous |
Post-SQL | יוצרת את ההבדל באחוזים בין השורות שמוצגות |
percent_of_total |
Post-SQL | יצירת האחוז מהסה"כ לכל שורה שמוצגת |
percentile |
צבירה | יוצרת את הערך באחוזון שצוין בתוך עמודה |
percentile_distinct |
צבירה | יוצרת בצורה תקינה את הערך באחוזון שצוין כשצירוף גורם ל-fanout. תיאור מלא מופיע בקטע percentile_distinct. |
running_total |
Post-SQL | יצירת הסכום המצטבר לכל שורה שמוצגת |
period_over_period |
צבירה | הפניה לצבירה מתקופה קודמת |
string |
לא מצטבר | למדדים שמכילים אותיות או תווים מיוחדים (כמו בפונקציה GROUP_CONCAT של MySQL) |
sum |
צבירה | יצירת סכום של ערכים בעמודה |
sum_distinct |
צבירה | יצירת סכום ערכים בצורה נכונה כשמשתמשים בנתונים לא מנורמלים.תיאור מלא מופיע בקטע sum_distinct. |
yesno |
לא מצטבר | לשדות שבהם יוצג אם משהו נכון או לא נכון |
int |
לא מצטבר |
הוסר בגרסה 5.4
הוחלף על ידי type: number |
average
הפונקציה type: average מחשבת את הממוצע של הערכים בשדה נתון. היא דומה לפונקציה AVG ב-SQL. עם זאת, בניגוד ל-SQL גולמי, Looker יחשב ממוצעים בצורה נכונה גם אם הצירופים של השאילתה מכילים fanouts.
הפרמטר sql למדדים מסוג type: average יכול לקבל כל ביטוי SQL תקין שמניב עמודה מספרית בטבלה, מאפיין LookML או שילוב של מאפייני LookML.
אפשר לעצב שדות type: average באמצעות הפרמטרים value_format או value_format_name.
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם avg_order על ידי חישוב הממוצע של המאפיין sales_price, ואז מציג אותו בפורמט של כסף ($1,234.56):
measure: avg_order {
type: average
sql: ${sales_price} ;;
value_format_name: usd
}
average_distinct
התכונה type: average_distinct מיועדת לשימוש עם קבוצות נתונים לא מנורמלות. הפונקציה מחשבת את הממוצע של הערכים הלא חוזרים בשדה נתון, על סמך הערכים הייחודיים שמוגדרים על ידי הפרמטר sql_distinct_key.
זהו מושג מתקדם, ודוגמה יכולה לעזור להסביר אותו בצורה ברורה יותר. נניח שיש לכם טבלה לא מנורמלת כזו:
| מזהה פריט בהזמנה | מזהה ההזמנה | משלוח ההזמנה |
|---|---|---|
| 1 | 1 | 10.00 |
| 2 | 1 | 10.00 |
| 3 | 2 | 20.00 |
| 4 | 2 | 20.00 |
| 5 | 2 | 20.00 |
במצב כזה, אפשר לראות שיש כמה שורות לכל הזמנה. לכן, אם תוסיפו מדד type: average בסיסי לעמודה order_shipping, תקבלו ערך של 16.00, למרות שהממוצע בפועל הוא 15.00.
# Will NOT calculate the correct average
measure: avg_shipping {
type: average
sql: ${order_shipping} ;;
}
כדי לקבל תוצאה מדויקת, אתם יכולים להגדיר ל-Looker איך לזהות כל ישות ייחודית (במקרה הזה, כל הזמנה ייחודית) באמצעות הפרמטר sql_distinct_key. הנוסחה הזו תחשב את הסכום הנכון, 15.00:
# Will calculate the correct average
measure: avg_shipping {
type: average_distinct
sql_distinct_key: ${order_id} ;;
sql: ${order_shipping} ;;
}
לכל ערך ייחודי של sql_distinct_key צריך להיות ערך תואם אחד בלבד ב-sql. במילים אחרות, הדוגמה הקודמת פועלת כי כל שורה עם ערך order_id של 1 כוללת את אותו ערך order_shipping של 10.00, וכל שורה עם ערך order_id של 2 כוללת את אותו ערך order_shipping של 20.00.
אפשר לעצב שדות מסוג type: average_distinct באמצעות הפרמטרים value_format או value_format_name.
count
type: count מבצעת ספירה של טבלה, בדומה לפונקציה COUNT ב-SQL. עם זאת, בניגוד ל-SQL גולמי, Looker יחשב את הספירות בצורה נכונה גם אם השאילתה מכילה fanouts.
מדדי type: count מבצעים ספירות של טבלאות שמבוססות על המפתח הראשי של הטבלה, ולכן מדדי type: count לא תומכים בפרמטר sql.
אם רוצים לבצע ספירה של שורות בטבלה בשדה שאינו המפתח הראשי של הטבלה, צריך להשתמש במדד type: count_distinct. לחלופין, אם לא רוצים להשתמש ב-count_distinct, אפשר להשתמש במדד type: number (מידע נוסף זמין בפוסט בקהילה How to count a non-primary key).
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם number_of_products:
view: products {
measure: number_of_products {
type: count
drill_fields: [product_details*] # optional
}
}
בדרך כלל, כשמגדירים מדד type: count, מציינים פרמטר drill_fields (בשביל שדות), כדי שהמשתמשים יוכלו לראות את הרשומות הבודדות שמרכיבות את הספירה כשהם לוחצים עליה.
כשמשתמשים במדד של
type: countב-Explore, התצוגה החזותית מתייגת את הערכים שמתקבלים בשם התצוגה במקום במילה "Count". כדי למנוע בלבול, מומלץ להשתמש בשם התצוגה בלשון רבים, לבחור באפשרות הצגת שם השדה המלא בקטע סדרה בהגדרות התצוגה החזותית, או להשתמש ב-view_labelעם גרסה בלשון רבים של שם התצוגה.
אפשר להוסיף מסנן למדד של type: count באמצעות הפרמטר filters.
count_distinct
type: count_distinct מחשבת את מספר הערכים השונים בשדה נתון. היא משתמשת בפונקציה COUNT DISTINCT של SQL.
הפרמטר sql של מדדי type: count_distinct יכול לקבל כל ביטוי SQL חוקי שיוצר עמודה בטבלה, מאפיין LookML או שילוב של מאפייני LookML.
לדוגמה, קוד LookML הבא יוצר שדה number_of_unique_customers שסופר את מספר מזהי הלקוחות הייחודיים:
measure: number_of_unique_customers {
type: count_distinct
sql: ${customer_id} ;;
}
אפשר להוסיף מסנן למדד של type: count_distinct באמצעות הפרמטר filters.
date
האופרטור type: date משמש בשדות שמכילים תאריכים.
הפרמטר sql של מדדי type: date יכול לקבל כל ביטוי SQL תקין שמחזיר תאריך. בפועל, כמעט ולא משתמשים בסוג הזה, כי רוב פונקציות הצבירה של SQL לא מחזירות תאריכים. חריג נפוץ אחד הוא MIN או MAX של מאפיין תאריך.
יצירת מדד של תאריך מקסימלי או מינימלי באמצעות type: date
אם אתם רוצים ליצור מדד של תאריך מקסימלי או מינימלי, יכול להיות שבהתחלה תחשבו שאפשר להשתמש במדד של type: max או של type: min. עם זאת, סוגי המדדים האלה תואמים רק לשדות מספריים. במקום זאת, אתם יכולים לתעד תאריך מקסימלי או מינימלי על ידי הגדרת מדד של type: date והוספת שדה התאריך שאליו מתייחס הפרמטר sql לפונקציה MIN() או MAX().
נניח שיש לכם קבוצת מאפיינים של type: time, שנקראת updated:
dimension_group: updated {
type: time
timeframes: [time, date, week, month, raw]
sql: ${TABLE}.updated_at ;;
}
כדי ליצור מדד של type: date שיציג את התאריך המקסימלי של קבוצת המאפיינים הזו, אפשר לפעול באופן הבא:
measure: last_updated_date {
type: date
sql: MAX(${updated_raw}) ;;
convert_tz: no
}
בדוגמה הזו, במקום להשתמש במדד type: max כדי ליצור את המדד last_updated_date, הפונקציה MAX() מוחלת בפרמטר sql. במדד last_updated_date, הפרמטר convert_tz מוגדר גם כ-no כדי למנוע המרה כפולה של אזור הזמן במדד, כי המרה של אזור הזמן כבר התרחשה בהגדרה של קבוצת המאפיינים updated. מידע נוסף זמין במסמכי התיעוד של הפרמטר convert_tz.
בדוגמה של LookML למדד last_updated_date, אפשר להשמיט את type: date, והערך יטופל כמחרוזת, כי string הוא ערך ברירת המחדל של type. עם זאת, אם תשתמשו ב-type: date, תקבלו יכולת סינון טובה יותר למשתמשים.
יכול להיות שתבחינו גם שההגדרה של המדד last_updated_date מתייחסת למסגרת הזמן ${updated_raw} במקום למסגרת הזמן ${updated_date}. הערך שמוחזר מ-${updated_date} הוא מחרוזת, ולכן צריך להשתמש ב-${updated_raw} כדי להפנות לערך התאריך בפועל.
אפשר גם להשתמש בפרמטר datatype עם type: date כדי לשפר את ביצועי השאילתה על ידי ציון סוג נתוני התאריך שמשמשים בטבלת מסד הנתונים.
יצירת מדד מקסימום או מינימום לעמודת תאריך ושעה
חישוב הערך המקסימלי בעמודה type: datetime מתבצע בצורה קצת שונה. במקרה כזה, כדאי ליצור מדד בלי להצהיר על הסוג, כך:
measure: last_updated_datetime {
sql: MAX(${TABLE}.datetime_string_field) ;;
}
list
type: list יוצרת רשימה של הערכים הייחודיים בשדה נתון. היא דומה לפונקציה GROUP_CONCAT ב-MySQL.
אין צורך לכלול פרמטר sql עבור מדדי type: list. במקום זאת, אפשר להשתמש בפרמטר list_field כדי לציין את המאפיין שממנו רוצים ליצור רשימות.
השימוש הוא כדלקמן:
view: view_name {
measure: field_name {
type: list
list_field: my_field_name
}
}
לדוגמה, קוד ה-LookML הבא יוצר מדד name_list על סמך המאפיין name:
measure: name_list {
type: list
list_field: name
}
הערות לגבי list:
- סוג המדד
listלא תומך בסינון. אי אפשר להשתמש בפרמטרfiltersבמדדtype: list. - אי אפשר להפנות לסוג המדד
listבאמצעות אופרטור ההחלפה ($). אי אפשר להשתמש בתחביר${}כדי להפנות למדדtype: list.
דיאלקטים נתמכים של מסדי נתונים ב-list
כדי ש-Looker יתמוך ב-type: list בפרויקט Looker, גם הדיאלקט של מסד הנתונים צריך לתמוך בו. בטבלה הבאה מפורטים הניבים שכוללים תמיכה ב-type: list בגרסה האחרונה של Looker:
| ניב | נתמך? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| ClickHouse 26+ | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Dremio 26+ with Arrow Flight SQL | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MongoSQL | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
max
הפונקציה type: max מוצאת את הערך הגדול ביותר בשדה נתון. היא משתמשת בפונקציה MAX של SQL.
הפרמטר sql למדדים של type: max יכול לקבל כל ביטוי SQL תקין שיוצר עמודה מספרית בטבלה, מאפיין LookML או שילוב של מאפייני LookML.
מכיוון שמידות של type: max תואמות רק לשדות מספריים, אי אפשר להשתמש במידה של type: max כדי למצוא תאריך מקסימלי. במקום זאת, אתם יכולים להשתמש בפונקציה MAX() בפרמטר sql של מדד של type: date כדי לתעד תאריך מקסימלי, כפי שמוצג בדוגמאות בקטע date.
אפשר לעצב שדות type: max באמצעות הפרמטרים value_format או value_format_name.
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם largest_order על סמך המאפיין sales_price, ואז מציג אותו בפורמט של כסף ($1,234.56):
measure: largest_order {
type: max
sql: ${sales_price} ;;
value_format_name: usd
}
אי אפשר להשתמש במדדים type: max למחרוזות או לתאריכים, אבל אפשר להוסיף ידנית את הפונקציה MAX כדי ליצור שדה כזה, כמו בדוגמה הבאה:
measure: latest_name_in_alphabet {
type: string
sql: MAX(${name}) ;;
}
median
הפונקציה type: median מחזירה את ערך נקודת האמצע של הערכים בשדה נתון. האפשרות הזו שימושית במיוחד אם בנתונים יש כמה ערכים חריגים גדולים או קטנים מאוד, שיגרמו להטיה של ממוצע בסיסי (mean) של הנתונים.
נניח שיש לכם טבלה כזו:
| מזהה פריט בהזמנה | עלות | נקודת אמצע? |
|---|---|---|
| 2 | 10.00 | |
| 4 | 10.00 | |
| 3 | 20.00 | ערך נקודת האמצע |
| 1 | 80.00 | |
| 5 | 90.00 |
הטבלה ממוינת לפי עלות, אבל זה לא משפיע על התוצאה. הסוג average יחזיר את הערך 42 (סכום כל הערכים חלקי 5), והסוג median יחזיר את ערך נקודת האמצע: 20.00.
אם יש מספר זוגי של ערכים, הערך החציוני מחושב על ידי חישוב הממוצע של שני הערכים הקרובים ביותר לנקודת האמצע. נניח שיש לנו טבלה כזו עם מספר זוגי של שורות:
| מזהה פריט בהזמנה | עלות | נקודת אמצע? |
|---|---|---|
| 2 | 10 | |
| 3 | 20 | הכי קרוב לפני אמצע המסלול |
| 1 | 80 | הכי קרוב אחרי אמצע הסרטון |
| 4 | 90 |
החציון, הערך האמצעי, הוא (20 + 80)/2 = 50.
החציון שווה גם לערך באחוזון ה-50.
הפרמטר sql של מדדי type: median יכול לקבל כל ביטוי SQL חוקי שיוצר עמודת טבלה מספרית, מאפיין LookML או שילוב של מאפייני LookML.
אפשר לעצב שדות type: median באמצעות הפרמטרים value_format או value_format_name.
דוגמה
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם median_order על ידי חישוב הממוצע של המאפיין sales_price, ואז מציג אותו בפורמט של כסף ($1,234.56):
measure: median_order {
type: median
sql: ${sales_price} ;;
value_format_name: usd
}
מה כדאי לקחת בחשבון לגבי median
אם אתם משתמשים ב-median בשדה שמעורב בהסתעפות, Looker ינסה להשתמש ב-median_distinct במקום זאת. עם זאת, medium_distinct נתמך רק בניבים מסוימים. אם median_distinct לא זמין לניב שלכם, Looker מחזיר שגיאה. מכיוון שאפשר להתייחס ל-median כאחוזון ה-50, מצב השגיאה מציין שהדיאלקט לא תומך באחוזונים נפרדים.
דיאלקטים נתמכים של מסדי נתונים ב-median
כדי ש-Looker יתמוך בסוג median בפרויקט Looker, הניב של מסד הנתונים צריך לתמוך בו גם כן. בטבלה הבאה מוצגים הניבים שתומכים בסוג median בגרסה האחרונה של Looker:
| ניב | יש תמיכה? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| ClickHouse 26+ | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Dremio 26+ with Arrow Flight SQL | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MongoSQL | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
כשיש fanout בשאילתה, Looker מנסה להמיר את median ל-median_distinct. ההצלחה של התכונה הזו תלויה בדיאלקטים שתומכים ב-median_distinct.
median_distinct
משתמשים ב-type: median_distinct כשהצירוף כולל fanout. היא מחשבת את הממוצע של הערכים שלא חוזרים על עצמם בשדה נתון, על סמך הערכים הייחודיים שמוגדרים בפרמטר sql_distinct_key. אם למדד אין פרמטר sql_distinct_key, המערכת של Looker מנסה להשתמש בשדה primary_key.
כדאי לעיין בתוצאה של שאילתה שמצטרפת לטבלאות Order Item ו-Order:
| מזהה פריט בהזמנה | מזהה ההזמנה | משלוח ההזמנה |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 1 | 10 |
| 3 | 2 | 20 |
| 4 | 3 | 50 |
| 5 | 3 | 50 |
| 6 | 3 | 50 |
במצב כזה, אפשר לראות שיש כמה שורות לכל הזמנה. השאילתה הזו כללה פיצול כי כל הזמנה ממופה לכמה פריטים בהזמנה. הפונקציה median_distinct מביאה את זה בחשבון ומוצאת את החציון בין הערכים הייחודיים 10, 20 ו-50, כך שהערך שיתקבל הוא 20.
כדי לקבל תוצאה מדויקת, אתם יכולים להגדיר ל-Looker איך לזהות כל ישות ייחודית (במקרה הזה, כל הזמנה ייחודית) באמצעות הפרמטר sql_distinct_key. כך מחשבים את הסכום הנכון:
measure: median_shipping {
type: median_distinct
sql_distinct_key: ${order_id} ;;
sql: ${order_shipping} ;;
}
לכל ערך ייחודי של sql_distinct_key צריך להיות רק ערך תואם אחד בפרמטר sql של המדד. במילים אחרות, הדוגמה הקודמת פועלת כי כל שורה עם ערך order_id של 1 כוללת את אותו ערך order_shipping של 10, וכל שורה עם ערך order_id של 2 כוללת את אותו ערך order_shipping של 20.
אפשר לעצב שדות מסוג type: median_distinct באמצעות הפרמטרים value_format או value_format_name.
דברים שכדאי לקחת בחשבון לגבי median_distinct
סוג המדד medium_distinct נתמך רק בניבים מסוימים. אם median_distinct לא זמין לדיאלקט, Looker מחזיר שגיאה. מכיוון שאפשר להתייחס ל-median כאחוזון ה-50, מצב השגיאה מציין שהדיאלקט לא תומך באחוזונים נפרדים.
ניבים נתמכים של מסדי נתונים עבור median_distinct
כדי ש-Looker יתמוך בסוג median_distinct בפרויקט Looker, הניב של מסד הנתונים צריך לתמוך בו גם כן. בטבלה הבאה מפורטים הניבים שבהם נתמך הסוג median_distinct בגרסה האחרונה של Looker:
| ניב | יש תמיכה? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| ClickHouse 26+ | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Dremio 26+ with Arrow Flight SQL | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MongoSQL | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
min
type: min מוצאת את הערך הקטן ביותר בשדה נתון. היא משתמשת בפונקציה MIN של SQL.
הפרמטר sql של מדדי type: min יכול לקבל כל ביטוי SQL חוקי שמניב עמודת טבלה מספרית, מאפיין LookML או שילוב של מאפייני LookML.
מאחר שמידות של type: min תואמות רק לשדות מספריים, אי אפשר להשתמש במידה של type: min כדי למצוא תאריך מינימלי. במקום זאת, אתם יכולים להשתמש בפונקציה MIN() בפרמטר sql של מדד type: date כדי לתעד ערך מינימלי, בדיוק כמו שאתם יכולים להשתמש בפונקציה MAX() עם מדד type: date כדי לתעד תאריך מקסימלי. הדוגמה הזו מוצגת למעלה בדף בקטע date, שכולל דוגמאות לשימוש בפונקציה MAX() בפרמטר sql כדי למצוא תאריך מקסימלי.
אפשר לעצב שדות type: min באמצעות הפרמטרים value_format או value_format_name.
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם smallest_order על ידי עיון במאפיין sales_price, ואז מציג אותו בפורמט של כסף ($1,234.56):
measure: smallest_order {
type: min
sql: ${sales_price} ;;
value_format_name: usd
}
אי אפשר להשתמש במדדים של type: min למחרוזות או לתאריכים, אבל אפשר להוסיף ידנית את הפונקציה MIN כדי ליצור שדה כזה, למשל:
measure: earliest_name_in_alphabet {
type: string
sql: MIN(${name}) ;;
}
number
type: number משמש עם מספרים או מספרים שלמים. מדד type: number לא מבצע צבירה, והוא נועד לבצע טרנספורמציות בסיסיות במדדים אחרים. אם אתם מגדירים מדד שמבוסס על מדד אחר, המדד החדש צריך להיות מסוג type: number כדי למנוע שגיאות של צבירה מקוננת.
הפרמטר sql של המדדים type: number יכול לקבל כל ביטוי SQL תקין שמחזיר מספר או מספר שלם.
אפשר לעצב שדות type: number באמצעות הפרמטרים value_format או value_format_name.
לדוגמה, קוד ה-LookML הבא יוצר מדד בשם total_gross_margin_percentage על סמך המדדים המצטברים total_sale_price ו-total_gross_margin, ואז מציג אותו בפורמט של אחוז עם שתי ספרות אחרי הנקודה העשרונית (12.34%):
measure: total_sale_price {
type: sum
value_format_name: usd
sql: ${sale_price} ;;
}
measure: total_gross_margin {
type: sum
value_format_name: usd
sql: ${gross_margin} ;;
}
measure: total_gross_margin_percentage {
type: number
value_format_name: percent_2
sql: ${total_gross_margin}/ NULLIF(${total_sale_price},0) ;;
}
בדוגמה הזו נעשה שימוש גם בפונקציית ה-SQL NULLIF() כדי למנוע אפשרות לשגיאות של חלוקה באפס.
דברים שכדאי לקחת בחשבון לגבי type: number
יש כמה דברים חשובים שצריך לזכור כשמשתמשים במדדים של type: number:
- מדד של
type: numberיכול לבצע פעולות חשבון רק על מדדים אחרים, ולא על מאפיינים אחרים. - צבירות סימטריות ב-Looker לא יגנו על פונקציות צבירה ב-SQL של מדד
type: numberכשהן מחושבות על פני איחוד. - אי אפשר להשתמש בפרמטר
filtersעם מדדיtype: number, אבל במסמכי התיעוד שלfiltersמוסבר על פתרון עקיף. - המדדים של
type: numberלא יספקו הצעות למשתמשים.
percent_of_previous
הפונקציה type: percent_of_previous מחשבת את ההפרש באחוזים בין תא מסוים לתא הקודם בעמודה שלו.
הפרמטר sql של המדדים type: percent_of_previous חייב להפנות למדד מספרי אחר.
אפשר לעצב שדות מסוג type: percent_of_previous באמצעות הפרמטרים value_format או value_format_name. עם זאת, הפורמטים של האחוזים של הפרמטר value_format_name לא פועלים עם מדדי type: percent_of_previous. בפורמטים האלה של אחוזים, הערכים מוכפלים ב-100, ולכן התוצאות של חישוב אחוז מהקודם מוטות.
בדוגמה הזו של LookML נוצר מדד count_growth שמבוסס על המדד count:
measure: count_growth {
type: percent_of_previous
sql: ${count} ;;
}

חשוב לזכור שהערכים של percent_of_previous תלויים בסדר המיון. אם משנים את המיון, צריך להריץ מחדש את השאילתה כדי לחשב מחדש את הערכים של percent_of_previous. במקרים שבהם השאילתה עוברת המרה, percent_of_previous פועל לאורך השורה במקום לאורך העמודה. אי אפשר לשנות את ההתנהגות הזו.
בנוסף, המדדים percent_of_previous מחושבים אחרי שהנתונים מוחזרים ממסד הנתונים. כלומר, אל תפנו למדד percent_of_previous בתוך מדד אחר. יכול להיות שהם יחושבו בזמנים שונים, ולכן יכול להיות שלא תקבלו תוצאות מדויקות. זה גם אומר שאי אפשר לסנן לפי מדדים של percent_of_previous.
אחד מהשימושים של סוג המדד הזה הוא ניתוח תקופה-על-פני-תקופה (PoP), שהוא דפוס ניתוח שמודד משהו בהווה ומשווה אותו לאותה מדידה בתקופת זמן דומה בעבר. מידע נוסף על PoP זמין במאמרים של קהילת Looker How to do Period-over-Period Analysis ו-Methods for Period Over Period (PoP) Analysis in Looker.
percent_of_total
type: percent_of_total מחשבת את החלק של התא מתוך הסכום הכולל של העמודה. האחוז מחושב ביחס לסך כל השורות שהוחזרו על ידי השאילתה, ולא ביחס לסך כל השורות האפשריות. עם זאת, אם הנתונים שמוחזרים על ידי השאילתה חורגים ממגבלת השורות, ערכי השדה יופיעו כערכים ריקים, כי נדרשות התוצאות המלאות כדי לחשב את האחוז מהסך הכולל.
הפרמטר sql של המדדים type: percent_of_total חייב להפנות למדד מספרי אחר.
אפשר לעצב שדות type: percent_of_total באמצעות הפרמטרים value_format או value_format_name. עם זאת, פורמטים של אחוזים של הפרמטר value_format_name לא פועלים עם מדדים של type: percent_of_total. הפורמטים האלה של אחוזים מכפילים את הערכים ב-100, מה שמעוות את התוצאות של חישוב percent_of_total.
בדוגמה הזו של LookML נוצר מדד percent_of_total_gross_margin שמבוסס על המדד total_gross_margin:
measure: percent_of_total_gross_margin {
type: percent_of_total
sql: ${total_gross_margin} ;;
}

במקרים שבהם מתבצעת ציר של שאילתה, הפונקציה percent_of_total פועלת לאורך השורה ולא לאורך העמודה. אם זה לא מה שאתם רוצים, מוסיפים direction: "column" להגדרת המדד.
בנוסף, מדדי percent_of_total מחושבים אחרי שהנתונים מוחזרים ממסד הנתונים. כלומר, אל תפנו למדד percent_of_total בתוך מדד אחר. יכול להיות שהם יחושבו בזמנים שונים, ולכן לא תקבלו תוצאות מדויקות. זה גם אומר שאי אפשר לסנן לפי מדדי percent_of_total.
percentile
type: percentile מחזירה את הערך באחוזון שצוין של הערכים בשדה נתון. לדוגמה, אם מציינים את האחוזון ה-75, הפונקציה תחזיר את הערך שגדול מ-75% מהערכים האחרים בקבוצת הנתונים.
כדי לזהות את הערך שיוחזר, Looker מחשב את המספר הכולל של ערכי הנתונים ומכפיל את האחוזון שצוין במספר הכולל של ערכי הנתונים. לא משנה איך הנתונים ממוינים בפועל, Looker מזהה את הסדר היחסי של ערכי הנתונים לפי ערך עולה. ערך הנתונים שמוחזר על ידי Looker תלוי בשאלה אם תוצאת החישוב היא מספר שלם או לא, כפי שמוסבר בשני הקטעים הבאים.
אם הערך המחושב הוא לא מספר שלם
מערכת Looker מעגלת את הערך המחושב כלפי מעלה ומשתמשת בו כדי לזהות את ערך הנתונים שיוחזר. בדוגמה הזו של 19 ציוני מבחן, האחוזון ה-75 יהיה 19 * 0.75 = 14.25, כלומר 75% מהערכים נמצאים ב-14 ערכי הנתונים הראשונים – מתחת למיקום ה-15. לכן, Looker מחזיר את ערך הנתונים ה-15 (87) כגדול מ-75% מערכי הנתונים.

אם הערך המחושב הוא מספר שלם
במקרה הזה, שהוא קצת יותר מורכב, Looker מחזיר את הממוצע של ערך הנתונים במיקום הזה ושל ערך הנתונים הבא. כדי להבין את זה, נניח שיש לנו קבוצה של 20 ציונים במבחן: האחוזון ה-75 יהיה 20 כפול 0.75, כלומר 15. המשמעות היא שערך הנתונים במיקום ה-15 הוא חלק מהאחוזון ה-75, ואנחנו צריכים להחזיר ערך שגבוה מ-75% מערכי הנתונים. כדי להבטיח ש-75% מהערכים יהיו קטנים או שווים לערך המוחזר, Looker מחזיר את הממוצע של הערכים במיקום ה-15 (82) ובמיקום ה-16 (87). הערך הממוצע (84.5) לא קיים בקבוצת ערכי הנתונים, אבל הוא גדול מ-75% מערכי הנתונים.

פרמטרים נדרשים ופרמטרים אופציונליים
משתמשים במילת המפתח percentile: כדי לציין את הערך החלקי, כלומר את אחוז הנתונים שצריך להיות מתחת לערך שמוחזר. לדוגמה, אפשר להשתמש ב-percentile: 75 כדי לציין את הערך באחוזון ה-75 בסדר הנתונים, או ב-percentile: 10 כדי להחזיר את הערך באחוזון ה-10. אם רוצים למצוא את הערך באחוזון ה-50, אפשר לציין percentile: 50 או פשוט להשתמש בסוג median.
הפרמטר sql של מדדי type: percentile יכול לקבל כל ביטוי SQL חוקי שיוצר עמודת טבלה מספרית, מאפיין LookML או שילוב של מאפייני LookML.
אפשר לעצב שדות type: percentile באמצעות הפרמטרים value_format או value_format_name.
דוגמה
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם test_scores_75th_percentile שמחזיר את הערך באחוזון ה-75 במאפיין test_scores:
measure: test_scores_75th_percentile {
type: percentile
percentile: 75
sql: ${TABLE}.test_scores ;;
}
מה כדאי לקחת בחשבון לגבי percentile
אם משתמשים ב-percentile בשדה שמשתתף בפיצול, Looker ינסה להשתמש ב-percentile_distinct במקום זאת. אם percentile_distinct לא זמין לדיאלקט, Looker מחזיר שגיאה. מידע נוסף זמין במאמר ניבים נתמכים ב-percentile_distinct.
דיאלקטים נתמכים של מסדי נתונים ב-percentile
כדי ש-Looker יתמוך בסוג percentile בפרויקט Looker, הניב של מסד הנתונים צריך לתמוך בו גם כן. בטבלה הבאה מפורט אילו ניבים תומכים בסוג percentile בגרסה האחרונה של Looker:
| ניב | יש תמיכה? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| ClickHouse 26+ | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Dremio 26+ with Arrow Flight SQL | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MongoSQL | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
percentile_distinct
הפונקציה type: percentile_distinct היא סוג מיוחד של אחוזון, וצריך להשתמש בה כשהצירוף כולל fanout. הוא משתמש בערכים שלא חוזרים על עצמם בשדה נתון, על סמך הערכים הייחודיים שמוגדרים בפרמטר sql_distinct_key. אם למדד אין פרמטר sql_distinct_key, המערכת של Looker מנסה להשתמש בשדה primary_key.
נניח שזו התוצאה של שאילתה שמחברת בין הטבלאות Order Item ו-Order:
| מזהה פריט בהזמנה | מזהה ההזמנה | משלוח ההזמנה |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 1 | 10 |
| 3 | 2 | 20 |
| 4 | 3 | 50 |
| 5 | 3 | 50 |
| 6 | 3 | 50 |
| 7 | 4 | 70 |
| 8 | 4 | 70 |
| 9 | 5 | 110 |
| 10 | 5 | 110 |
במצב הזה, אפשר לראות שיש כמה שורות לכל הזמנה. השאילתה הזו כללה פיצול כי כל הזמנה ממופה לכמה פריטים בהזמנה. הפונקציה percentile_distinct לוקחת את זה בחשבון ומוצאת את ערך האחוזון באמצעות הערכים הייחודיים 10, 20, 50, 70 ו-110. האחוזון ה-25 יחזיר את הערך הייחודי השני, או 20, והאחוזון ה-80 יחזיר את הממוצע של הערך הייחודי הרביעי והחמישי, או 90.
פרמטרים נדרשים ואופציונליים
משתמשים במילת המפתח percentile: כדי לציין את הערך החלקי. לדוגמה, משתמשים ב-percentile: 75 כדי לציין את הערך באחוזון ה-75 בסדר הנתונים, או ב-percentile: 10 כדי להחזיר את הערך באחוזון ה-10. אם אתם מנסים למצוא את הערך באחוזון ה-50, אתם יכולים להשתמש במקום זאת בסוג median_distinct.
כדי לקבל תוצאה מדויקת, צריך לציין איך Looker צריך לזהות כל ישות ייחודית (במקרה הזה, כל הזמנה ייחודית) באמצעות הפרמטר sql_distinct_key.
דוגמה לשימוש ב-percentile_distinct כדי להחזיר את הערך באחוזון ה-90:
measure: order_shipping_90th_percentile {
type: percentile_distinct
percentile: 90
sql_distinct_key: ${order_id} ;;
sql: ${order_shipping} ;;
}
לכל ערך ייחודי של sql_distinct_key צריך להיות רק ערך תואם אחד בפרמטר sql של המדד. במילים אחרות, הדוגמה הקודמת עובדת כי בכל שורה עם order_id של 1 יש את אותו order_shipping של 10, ובכל שורה עם order_id של 2 יש את אותו order_shipping של 20.
אפשר לעצב שדות type: percentile_distinct באמצעות הפרמטרים value_format או value_format_name.
מה כדאי לקחת בחשבון לגבי percentile_distinct
אם percentile_distinct לא זמין לדיאלקט, Looker מחזיר שגיאה. למידע נוסף, קראו על הניבים הנתמכים ב-percentile_distinct.
ניבים נתמכים של מסדי נתונים עבור percentile_distinct
כדי ש-Looker יתמוך בסוג percentile_distinct בפרויקט Looker, גם הניב של מסד הנתונים צריך לתמוך בו. בטבלה הבאה מפורטים הניבים שבהם נתמך הסוג percentile_distinct בגרסה האחרונה של Looker:
| ניב | יש תמיכה? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| ClickHouse 26+ | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Dremio 26+ with Arrow Flight SQL | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MongoSQL | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
period_over_period
בניבים שתומכים במדדים של השוואה לתקופה קודמת, אפשר ליצור מדד LookML של type: period_over_period כדי ליצור מדד של השוואה לתקופה קודמת (PoP). מדד PoP מתייחס לצבירה מתקופה מוקדמת יותר.
הנה דוגמה למדד PoP שמספק את מספר ההזמנות בחודש הקודם:
measure: orders_last_month {
type: period_over_period
based_on: orders.count
based_on_time: orders.created_month
period: month
kind: previous
}
במדדים עם type: period_over_period צריכים להיות גם תתי-הפרמטרים הבאים:
based_onbased_on_timekindperiodאו, אם מבססים את מדד ה-PoP על יומן מותאם אישית,custom_calendar_period
מידע נוסף ודוגמאות זמינים במאמר בנושא השוואה בין תקופות ב-Looker.
running_total
הפונקציה type: running_total מחשבת סכום מצטבר של התאים לאורך עמודה. אי אפשר להשתמש בה כדי לחשב סכומים לאורך שורה, אלא אם השורה נוצרה כתוצאה מטבלת צירים.
הפרמטר sql של המדדים type: running_total חייב להפנות למדד מספרי אחר.
אפשר לעצב שדות type: running_total באמצעות הפרמטרים value_format או value_format_name.
בדוגמה הבאה של LookML נוצר מדד cumulative_total_revenue שמבוסס על המדד total_sale_price:
measure: cumulative_total_revenue {
type: running_total
sql: ${total_sale_price} ;;
value_format_name: usd
}

חשוב לזכור שהערכים של running_total תלויים בסדר המיון. אם משנים את המיון, צריך להריץ מחדש את השאילתה כדי לחשב מחדש את הערכים של running_total. במקרים שבהם השאילתה עוברת ציר, running_total פועל לאורך השורה במקום לאורך העמודה. אם זה לא מה שאתם רוצים, מוסיפים direction: "column" להגדרת המדד.
בנוסף, המדדים running_total מחושבים אחרי שהנתונים מוחזרים ממסד הנתונים. המשמעות היא שאסור להפנות למדד running_total בתוך מדד אחר, כי יכול להיות שהחישובים שלהם יתבצעו בזמנים שונים, ולכן התוצאות לא יהיו מדויקות. זה גם אומר שאי אפשר לסנן לפי מדדי running_total.
string
האופרטור type: string משמש בשדות שמכילים אותיות או תווים מיוחדים.
הפרמטר sql של מדדי type: string יכול לקבל כל ביטוי SQL תקין שמחזיר מחרוזת. בפועל, כמעט ולא משתמשים בסוג הזה, כי רוב פונקציות הצבירה ב-SQL לא מחזירות מחרוזות. יוצא דופן נפוץ הוא הפונקציה GROUP_CONCAT של MySQL, אבל Looker מספקת את type: list לתרחיש השימוש הזה.
לדוגמה, קוד ה-LookML הבא יוצר שדה category_list על ידי שילוב הערכים הייחודיים של שדה שנקרא category:
measure: category_list {
type: string
sql: GROUP_CONCAT(${category}) ;;
}
בדוגמה הזו אפשר להשמיט את type: string, כי string הוא ערך ברירת המחדל של type.
sum
הפונקציה type: sum מחברת את הערכים בשדה נתון. היא דומה לפונקציה SUM של SQL. עם זאת, בניגוד ל-SQL גולמי, Looker יחשב את הסכומים בצורה נכונה גם אם הצטרפות השאילתה מכילה פיצולים.
הפרמטר sql למדדים מסוג type: sum יכול לקבל כל ביטוי SQL תקין שמניב עמודה מספרית בטבלה, מאפיין LookML או שילוב של מאפייני LookML.
אפשר לעצב שדות type: sum באמצעות הפרמטרים value_format או value_format_name.
לדוגמה, קוד ה-LookML הבא יוצר שדה בשם total_revenue על ידי חיבור של הממד sales_price, ואז מציג אותו בפורמט של כסף ($1,234.56):
measure: total_revenue {
type: sum
sql: ${sales_price} ;;
value_format_name: usd
}
sum_distinct
הפונקציה type: sum_distinct מיועדת לשימוש עם קבוצות נתונים שעברו דה-נורמליזציה. הפונקציה מחברת את הערכים הלא חוזרים בשדה נתון, על סמך הערכים הייחודיים שמוגדרים על ידי הפרמטר sql_distinct_key.
זהו קונספט מתקדם, ואולי יהיה קל יותר להבין אותו בעזרת דוגמה. נניח שיש לכם טבלה לא מנורמלת כזו:
| מזהה פריט בהזמנה | מזהה ההזמנה | משלוח ההזמנה |
|---|---|---|
| 1 | 1 | 10.00 |
| 2 | 1 | 10.00 |
| 3 | 2 | 20.00 |
| 4 | 2 | 20.00 |
| 5 | 2 | 20.00 |
במצב כזה, אפשר לראות שיש כמה שורות לכל הזמנה. לכן, אם הוספתם מדד type: sum לעמודה order_shipping, תקבלו סכום כולל של 80.00, למרות שסכום המשלוח הכולל שנגבה הוא למעשה 30.00.
# Will NOT calculate the correct shipping amount
measure: total_shipping {
type: sum
sql: ${order_shipping} ;;
}
כדי לקבל תוצאה מדויקת, אתם יכולים להגדיר ל-Looker איך לזהות כל ישות ייחודית (במקרה הזה, כל הזמנה ייחודית) באמצעות הפרמטר sql_distinct_key. הקוד הזה יחשב את הסכום הנכון, 30.00:
# Will calculate the correct shipping amount
measure: total_shipping {
type: sum_distinct
sql_distinct_key: ${order_id} ;;
sql: ${order_shipping} ;;
}
לכל ערך ייחודי של sql_distinct_key צריך להיות ערך תואם אחד בלבד ב-sql. במילים אחרות, הדוגמה הקודמת פועלת כי בכל שורה עם order_id של 1 יש את אותו order_shipping של 10.00, ובכל שורה עם order_id של 2 יש את אותו order_shipping של 20.00.
אפשר לעצב שדות type: sum_distinct באמצעות הפרמטרים value_format או value_format_name.
yesno
type: yesno יוצרת שדה שמציין אם משהו נכון או לא נכון. הערכים מופיעים כ-Yes ו-No בממשק המשתמש של Explore.
הפרמטר sql למדד type: yesno מקבל ביטוי SQL תקין שהערך המחושב שלו הוא TRUE או FALSE. אם התנאי מקבל את הערך TRUE, למשתמש מוצג כן. אחרת, מוצג לא.
ביטוי ה-SQL של המדדים type: yesno חייב לכלול רק צבירות, כלומר צבירות SQL או הפניות למדדי LookML. אם רוצים ליצור שדה yesno שכולל הפניה למאפיין LookML או לביטוי SQL שהוא לא צבירה, צריך להשתמש במאפיין עם type: yesno, ולא במדד.
בדומה למדדים עם type: number, מדד עם type: yesno לא מבצע צבירות, אלא רק מפנה לצבירות אחרות.
לדוגמה, המדד הבא total_sale_price הוא סכום המחיר הכולל של פריטים בהזמנה. מדד שני שנקרא is_large_total הוא type: yesno. למדד is_large_total יש פרמטר sql שמעריך אם הערך של total_sale_price גדול מ-1,000$.
measure: total_sale_price {
type: sum
value_format_name: usd
sql: ${sale_price} ;;
drill_fields: [detail*]
}
measure: is_large_total {
description: "Is order total over $1000?"
type: yesno
sql: ${total_sale_price} > 1000 ;;
}
אם רוצים להפנות לשדה type: yesno בשדה אחר, צריך להתייחס לשדה type: yesno כערך בוליאני (כלומר, כאילו הוא כבר מכיל ערך true או false). לדוגמה:
measure: is_large_total {
description: "Is order total over $1000?"
type: yesno
sql: ${total_sale_price} > 1000 ;;
}
# This is correct:
measure: reward_points {
type: number
sql: CASE WHEN ${is_large_total} THEN 200 ELSE 100 END ;;
}
# This is NOT correct:
measure: reward_points {
type: number
sql: CASE WHEN ${is_large_total} = 'Yes' THEN 200 ELSE 100 END ;;
}