תחביר ושימוש ב-PQL
PQL היא שפה דמוית SQL לביצוע שאילתות על אובייקטים. תחביר PQL דומה לתחביר של SQL, עם כמה הבדלים שמתוארים כאן. בקטע הזה מתואר תחביר ה-PQL ואיך להשתמש בו כדי לסנן סוגי אובייקטים שונים.
ניתן לסכם את תחביר ה-PQL באופן הבא:
[WHERE <condition> {[AND | OR] <condition> ...}] [ORDER BY <property> [ASC | DESC]] [LIMIT {[<offset>,] <count>} | {<count> OFFSET <offset>}] <condition> := <property> { = | != } <value> <condition> := <property> { = | != } <bind variable> <condition> := <property> IN <list> <condition> := NOT <property> IN <list> <condition> := <property> LIKE <wildcard%match> <condition> := <property> IS NULL <bind variable> := :<name>
הערות
- מילות מפתח מסוג PQL אינן תלויות אותיות רישיות.
- מחרוזות מסומנות בתו בריחה (escape) באופן אוטומטי כשמשתמשים בהן בפרמטרים של קישור. אחרת:
עבור מחרוזת בתוך מירכאות יחידות (גרש), משתמשים בתוכוי גרש נוסף וכותבים אותו כצמד של גרש יחיד.
לדוגמה:"WHERE name = 'Company''s name'"
מילות מפתח (לא תלויות-רישיות)
WHERE
- מבטאת קבוצה של אפס תנאים או יותר, אם רוצים לצרף אותם באמצעות ביטויי AND או OR. אפשר לקבץ ביטויי AND או OR בסוגריים. הרצת השאילתה""
(מחרוזת ריקה) תחזיר את הכול.דוגמאות:
WHERE width = 728
WHERE width = 728 AND height = 90
WHERE (width = 728 AND height = 90) OR id IN (5008, 8745, 3487)
OR
– מצטרף למספר תנאים, שרק אחד מהם חייב להתקיים. אם רוצים לבדוק מספר ערכים בנכס יחיד, כדאי להשתמש בתנאיIN
.לדוגמה:
WHERE width = 728 OR height = 90
AND
– הפונקציה מגדירה כמה תנאים שכולם צריכים להתקיים באמצעות סעיף AND.לדוגמה:
WHERE type = 'AGENCY' AND name IN ('CompanyNameA', 'CompanyNameB')
ORDER BY
- מיון התוצאות שהוחזרו בסדר עולה (ASC
כאשר 'A' היא הראשונה) או בסדר יורד (DESC
כאשר 'A' הוא הסדר האחרון). אם לא מציינים את הכיוון, ברירת המחדל היאASC
. אם הסעיף הזה לא כלול, ברירת המחדל היאASC
בשדה הראשון.לדוגמה:
WHERE id IN (5008, 8745, 3487) ORDER BY id
LIMIT
- מספר התוצאות שיש להחזיר. השדהLIMIT
יכול לכלול גם<offset>
, שהוא מספר השורות שמתחילות לקזז את התוצאות שהוגדרו.דוגמאות (שתי הדוגמאות מחזירות את אותה קבוצת תוצאות):
WHERE type = 'AGENCY' LIMIT 50 OFFSET 50
WHERE type = 'AGENCY' LIMIT 50,50
OFFSET
- ההיסט לתוצאה שהוגדר כדי להתחיל להחזיר ערכים. אפשר להשתמש בה כדי לדפדף בתוצאות.דוגמה (מחזירה את התוצאות 51-100):
WHERE type = 'AGENCY' LIMIT 50 OFFSET 50
.<property>
– אחד המאפיינים שהאובייקט חושף. כל אובייקט חושף מאפיינים שונים שלפיהם אפשר לסנן, באמצעות PQL. בדרך כלל אי אפשר לסנן את כל המאפיינים שנתמכים על ידי אובייקט. מומלץ לעיין ברשימה הבאה כדי לבדוק אילו מאפיינים תומכים בשאילתות PQL. לדוגמה, מאפייני הקריאייטיב שאפשר לסנן לפיהם כוללים אתid
,name
,width
ו-height
.<value>
- יש להקיף את ערכי המחרוזת עם סימן מירכאות (') יחיד. אפשר לצטט או לבטל מרכאות של ערכים. אין תמיכה בתווים כלליים לחיפוש.IN
- השוואת הערך של מאפיין לכל פריט ברשימה. אם אחד מהם תואם לערך של המאפיין, זו התאמה חיובית. האופרטורIN
מקביל לשאילתות רבות של=
, אחת לכל ערך, שמאורגנות ביחד. הערכים מצוינים כרשימת ערכים שמופרדים בפסיקים ומוקפים בסוגריים: (a, b, c). כל הערכים ברשימה נבדקים.לדוגמה:
WHERE name IN ('CompanyNameA', 'CompanyNameB')
NOT IN
- השוואת הערך של מאפיין לכל פריט ברשימה. אם אין התאמה, זו התאמה חיובית. האופרטורNOT IN
מקביל לשאילתות רבות של!=
, אחת לכל ערך, שמאורגנות ביחד. הערכים מצוינים כרשימת ערכים שמופרדים בפסיקים ומוקפים בסוגריים: (a, b, c). כל הערכים ברשימה נבדקים.לדוגמה:
WHERE NOT name IN ('CompanyNameA', 'CompanyNameB')
LIKE
- מאפשרת להריץ שאילתות על אובייקטים באמצעות התאמת מחרוזות של תווים כלליים לחיפוש. סימן האחוז (%
) מייצג תו אחד, אפס או תווים מרובים. משתמשים בזוג כדי לתחום את מחרוזת החיפוש שמותאמת.דוגמאות:
WHERE name LIKE 'foo %searchString% bar'
WHERE name LIKE 'Aus%'
IS NULL
– מאפשרת להריץ שאילתות על אובייקטים עם ערך מאפיין לא מוגדר. הדוגמה הקלאסית לכך היא שאילתה לשורשAdUnit
באמצעות שאילתה ל-AdUnit
עם מזהה הורה null.לדוגמה:
WHERE parentId IS NULL
.<bind variable>
- אפשר להשתמש באובייקטיםValue
במקום בערכי <value> שכתובים בתוך הקוד בשאילתת ה-PQL. ב-PQL, משתנה הקישור נוצר באמצעות שם מחרוזת ללא רווחים, והוא מתחיל ב-: (נקודתיים).דוגמה (יצירה של שאילתה והזנה של שני משתנים במקום ערכי המאפיין
id
ו-status
בתוך הקוד):// Create two mapped parameters: id and status String_ValueMapEntry[] values = new String_ValueMapEntry[2]; values[0] = new String_ValueMapEntry("id", new NumberValue(null, "123")); values[1] = new String_ValueMapEntry("status", new TextValue(null, "APPROVED")); // Create our statement and map our bind variables Statement statement = new Statement(); statement.setQuery("WHERE id = :id AND status = :status LIMIT 500"); statement.setValues(values);
- שדות
DateTime
– אפשר לסנן לפי תאריך ושעה על ידי הקצאת ערך שלDateTime
למשתנה הקישור, או באמצעות מחרוזת בפורמט שתואם לתקן ISO 8601.// Create a bind variable: startDateTime String_ValueMapEntry[] values = new String_ValueMapEntry[1]; values[0] = new String_ValueMapEntry("startDateTime", new DateTimeValue(null, dateTime)); // Create our statement and map our bind variables Statement statement = new Statement(); statement.setQuery("WHERE endDateTime < '2019-01-01T00:00:00' AND startDateTime > :startDateTime LIMIT 500"); statement.setValues(values);
מתבצע אחזור של טבלאות של התאמות עם PQL
טבלאות התאמות מספקות מנגנון לחיפוש הערכים הגולמיים שכלולים בקבצים של העברת נתונים, וכך מאפשר להתאים מידע על הצגת מודעות (למשל, יחידת מודעות או פריט) לערכים שהוקצו מראש במסד הנתונים.
אם אתם מפעילים דוחות דרך ReportService או באמצעות דוחות העברת נתונים, מומלץ להוסיף לנתוני הדוח שדות נוספים. לדוגמה, בדוח שמכיל את המאפיין LINE_ITEM_ID או אירוע של העברת נתונים שמכיל את השדה LineItemId, אפשר ליצור טבלת התאמה שכוללת את תאריך ההתחלה, תאריך הסיום, הסוג, הסטטוס ומאפיינים שימושיים אחרים של כל פריט.
יש כמה דרכים לעשות זאת:
- משתמשים בטבלאות ההתאמות המוכנות מראש שמסופקות על ידי שירות העברת הנתונים ל-BigQuery. שימו לב שטבלאות ההתאמות האלה לא כוללות את כל השדות של הישויות.
- שיטה יעילה היא להשתמש בכל אחת מהטבלאות הזמינות של PublisherQueryLanguageService.
- אם לישות אין טבלת BigQuery או PQL, או שבטבלה חסרים שדות שדרושים לך, אפשר לעבור ישירות דרך השירות של הישות, למשל OrderService.
Python
הגדרת שאילתת דוח
מתחילים ביצירת משימת דוח, ומציינים את הפרמטרים של הדוח כמו מאפיינים, עמודות וטווח תאריכים.
# Set the start and end dates of the report to run (past 8 days). end_date = date.today() start_date = end_date - timedelta(days=8) # Create report job. report_job = { 'reportQuery': { 'dimensions': ['LINE_ITEM_ID', 'LINE_ITEM_NAME'], 'columns': ['AD_SERVER_IMPRESSIONS', 'AD_SERVER_CLICKS', 'AD_SERVER_CTR', 'AD_SERVER_CPM_AND_CPC_REVENUE', 'AD_SERVER_WITHOUT_CPD_AVERAGE_ECPM'], 'dateRangeType': 'CUSTOM_DATE', 'startDate': start_date, 'endDate': end_date } }
הורדת הדוח
# Initialize a DataDownloader. report_downloader = client.GetDataDownloader(version='v202402') try: # Run the report and wait for it to finish. report_job_id = report_downloader.WaitForReport(report_job) except errors.AdManagerReportError as e: print('Failed to generate report. Error was: %s' % e) with tempfile.NamedTemporaryFile( suffix='.csv.gz', mode='wb', delete=False) as report_file: # Download report data. report_downloader.DownloadReportToFile( report_job_id, 'CSV_DUMP', report_file)
הורדת נתונים מטבלת ה-PQL של פריט Line_Item
כדי להתאים את הדוח לנתונים נוספים של פריטים, אפשר להשתמש בטבלת PQL Line_Item.
# Create a PQL query to fetch the line item data line_items_pql_query = ('SELECT Id, LineItemType, Status FROM LineItem') # Download the response from PQL select statement line_items = report_downloader.DownloadPqlResultToList(line_items_pql_query)
איחוד נתוני דוח עם נתוני פריטים
בדוגמה הזו השתמשנו בספריית פנדות, כי קל הרבה יותר לעבוד עם נתונים בטבלאות. כאן משתמשים כדי לאחד את נתוני הדוח עם נתוני ה-PQL כדי ליצור טבלת התאמות.
# Use pandas to join the two csv files into a match table report = pandas.read_csv(report_file.name) line_items = pandas.DataFrame(data=line_items[1:], columns=line_items[0]) merged_result = pandas.merge(report, line_items, left_on='Dimension.LINE_ITEM_ID', right_on='id') merged_result.to_csv('~/complete_line_items_report.csv', index=False)הצגה ב-GitHub