Синтаксис и использование 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 не чувствительны к регистру.
- Строки автоматически экранируются при использовании в параметрах привязки. В противном случае:
Для строки, заключенной в одинарные кавычки (апострофы), избегайте любого дополнительного апострофа, записывая его в виде пары одинарных кавычек.
Пример:"WHERE name = 'Company''s name'"
Ключевые слова (без учета регистра)
-
WHERE
— выражает набор из нуля или более условий, опционально объединенных с помощью фраз «И» или «ИЛИ». Вы можете объединить фразы И или ИЛИ круглыми скобками. Выполнение запроса""
(пустая строка) возвращает все.Примеры:
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
с нулевым родительским идентификатором.Пример:
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 .
Питон
Настройка запроса отчета
Начните с создания задания отчета, указав параметры отчета, такие как измерения, столбцы и диапазон дат.
# 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='v202408') 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)
Загрузите данные из таблицы Line_Item PQL.
Чтобы сопоставить отчет с дополнительными данными о позиции, вы можете использовать таблицу 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)
Объединение данных отчета с данными позиции
В этом примере используется библиотека pandas , поскольку она значительно упрощает работу с табличными данными. Здесь он используется для объединения данных отчета с данными 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