This repository was archived by the owner on Jul 8, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathpacing.json
More file actions
executable file
·282 lines (282 loc) · 32.1 KB
/
pacing.json
File metadata and controls
executable file
·282 lines (282 loc) · 32.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
{
"script":{
"released":"2018-01-12",
"copyright":"Copyright 2020 Google LLC",
"icon":"directions_run",
"title":"DV360 Pacing",
"description":"Pace the spend of DV360 campaigns to hit targets.",
"redo":"https://team.git.corp.google.com/cse-dclk/whiterun/+/refs/heads/master/src/dag/bestbuy.py",
"from":["dv360", "sheets"],
"to":["bigquery", "datastudio"],
"pitches":[
"Optimize spend to prevent under spend.",
"Optimize spend to prevent over spend.",
"Allow client traders to enter budgets.",
"Allow client traders to categorize spend."
],
"impacts":{
"spend optimization":100,
"spend growth":80,
"time savings":60,
"account health":80,
"csat improvement":90
},
"instructions":[
"Provide a TRIX URL, we'll add new sheets with instructions.",
"Wait for the pacing tables to be createdin the **{field:dataset}** dataset.",
"Copy and connect each datastudio source to it's respective table...",
"Copy [Pacing Template LI Breakdown](https://datastudio.google.com/open/0BxNSN-sP1UmzUzdobUhITUxKY0E).",
"Copy [Pacing Template Advertiser Spend Rollup](https://datastudio.google.com/open/0BxNSN-sP1UmzWjU4ckl3ZUZrZE0).",
"Copy [Pacing Template Pacing Impressions](https://datastudio.google.com/open/0BxNSN-sP1UmzcEFzVEw3ZnM0WVk).",
"Copy [Pacing Template Pacing Datasource](https://datastudio.google.com/open/0BxNSN-sP1Umzd1BRVjV4QVFLd2M).",
"After the above datasets are set up...",
"Copy [Pacing Sample Report](https://datastudio.google.com/open/0BxNSN-sP1UmzMk5lVlVjR29KdFk).",
"Select the data sources you created in the steps above.",
"Or give these intructions to the client."
],
"authors":["mauriciod@google.com"]
},
"setup":{
"day":["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
"hour":[2, 6, 8, 12]
},
"tasks":[
{ "dataset":{
"hour":[2],
"auth":{"field":{ "name":"auth_write", "kind":"authentication", "order":1, "default":"service", "description":"Credentials used for writing data." }},
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
}},
{ "entity":{
"hour":[2, 8],
"auth":{"field":{ "name":"auth_read", "kind":"authentication", "order":1, "default":"user", "description":"Credentials used for reading data." }},
"accounts": {"field":{ "name":"dbm_accounts", "kind":"integer_list", "order":2, "description":"Comma seperated list of DV360 partner ids." }},
"entities": ["LineItem", "InsertionOrder", "Advertiser"],
"out": {
"bigquery":{
"auth":{"field":{ "name":"auth_write", "kind":"authentication", "order":1, "default":"service", "description":"Credentials used for writing data." }},
"dataset": {"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
}
}
}},
{ "dbm": {
"hour":[2],
"auth": "user",
"delete":true,
"report": {
"name":{"field":{ "name":"dataset", "kind":"string", "prefix":"Pacing_" }},
"timezone":{"field":{ "name":"timezone", "kind":"timezone", "prefix":"Pacing_" }},
"type":"TYPE_CROSS_PARTNER",
"data_range":"LAST_365_DAYS",
"accounts":{"field":{ "name":"dbm_accounts", "kind":"integer_list", "order":2, "description":"Comma seperated list of DV360 partner ids." }},
"dimensions":[
"FILTER_DATE",
"FILTER_PARTNER",
"FILTER_ADVERTISER",
"FILTER_INSERTION_ORDER",
"FILTER_LINE_ITEM"
],
"metrics": [
"METRIC_TOTAL_MEDIA_COST_ADVERTISER",
"METRIC_REVENUE_ADVERTISER",
"METRIC_IMPRESSIONS",
"METRIC_CLICKS"
]
}
}},
{ "dbm": {
"hour":[6, 12],
"auth": "user",
"report": {
"name":{"field":{ "name":"dataset", "kind":"string", "prefix":"Pacing_" }}
},
"out": {
"bigquery": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_Spend_Report",
"schema":[
{ "name":"Report_Day", "type":"STRING" },
{ "name":"Partner", "type":"STRING" },
{ "name":"Partner_ID", "type":"INTEGER" },
{ "name":"Partner_Status", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Advertiser", "type":"STRING" },
{ "name":"Advertiser_ID", "type":"INTEGER" },
{ "name":"Advertiser_Status", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Advertiser_Integration_Code", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Insertion_Order", "type":"STRING" },
{ "name":"Insertion_Order_ID", "type":"INTEGER" },
{ "name":"Insertion_Order_Status", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Insertion_Order_Integration_Code", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Line_Item", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Line_Item_ID", "type":"INTEGER", "mode":"NULLABLE" },
{ "name":"Line_Item_Status", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Line_Item_Integration_Code", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Targeted_Data_Providers", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Advertiser_Currency", "type":"STRING" },
{ "name":"Cost", "type":"FLOAT" },
{ "name":"Revenue", "type":"FLOAT" },
{ "name":"Impressions", "type":"INTEGER" },
{ "name":"Clicks", "type":"INTEGER" }
]
}
}
}},
{ "sheets":{
"hour":[6, 12],
"auth":{"field":{ "name":"auth_read", "kind":"authentication", "order":1, "default":"user", "description":"Credentials used for reading data." }},
"template":{
"sheet":"https://docs.google.com/spreadsheets/d/1OG3_6hPCGXjcH90hxzqMWZRZ7BV40bLqONwRdKx13pg/edit?usp=sharing",
"tab":"Pacing_Traders"
},
"sheet":{"field":{ "name":"sheet_url", "kind":"string", "order":4, "description":"URL for sheet storing ids." }},
"tab":"Pacing_Traders",
"range":"A1:C",
"header":true,
"out":{
"bigquery":{
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table":"Pacing_Traders",
"schema":[
{ "name":"Trader", "type":"STRING" },
{ "name":"Insertion_Order_ID", "type":"INTEGER" },
{ "name":"Insertion_Order", "type":"STRING", "mode":"NULLABLE" }
]
}
}
}},
{ "sheets":{
"hour":[6, 12],
"auth":{"field":{ "name":"auth_read", "kind":"authentication", "order":1, "default":"user", "description":"Credentials used for reading data." }},
"template":{
"sheet":"https://docs.google.com/spreadsheets/d/1OG3_6hPCGXjcH90hxzqMWZRZ7BV40bLqONwRdKx13pg/edit?usp=sharing",
"tab":"Pacing_Budget"
},
"sheet":{"field":{ "name":"sheet_url", "kind":"string", "order":4, "description":"URL for sheet storing ids." }},
"tab":"Pacing_Budget",
"range":"A1:F",
"header":true,
"out":{
"bigquery":{
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table":"Pacing_Budget",
"schema":[
{ "name":"Trader", "type":"STRING" },
{ "name":"Advertiser_ID", "type":"INTEGER" },
{ "name":"Advertiser", "type":"STRING", "mode":"NULLABLE" },
{ "name":"Budget_Quarter", "type":"FLOAT", "mode":"NULLABLE" },
{ "name":"Budget_Year", "type":"FLOAT", "mode":"NULLABLE" }
]
}
}
}},
{ "bigquery": {
"hour":[6, 12],
"auth": "service",
"to": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_Yesterday_Spend"
},
"from": {
"query": "SELECT Report_Day, Partner, Advertiser, Insertion_Order, Insertion_Order_ID, Insertion_Order_Status, Insertion_Order_Integration_Code, Line_Item, Line_Item_ID, Line_Item_Status, Line_Item_Integration_Code, Targeted_Data_Providers, Advertiser_Currency, Cost, Revenue, Impressions FROM [PARAMETER].Pacing_Spend_Report WHERE Report_Day = (SELECT STRFTIME_UTC_USEC(DATE_ADD(NOW(), -1, 'DAY'), '%Y/%m/%d'))",
"parameters":[
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
]
}
}},
{ "bigquery": {
"hour":[6, 12],
"auth": "service",
"to": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_Pacing_View"
},
"from": {
"query": "SELECT u.adv_id adv_id, u.adv_trader adv_trader, u.io_trader io_trader, u.advertiser advertiser, u.io io, u.io_id io_id, u.days_passed days_passed, u.days_left days_left, GREATEST(u.budget_left, 0) budget_left, u.spend spend, u.budget budget, u.expected_spend expected_spend, GREATEST(u.expected_spend - u.spend, 0) ammount_behind, u.previous_day_spend previous_day_spend, GREATEST(u.budget_left / u.days_left, 0) target_daily_spend, u.spend / u.days_passed avg_daily_spend, LEAST(u.previous_day_spend / GREATEST(u.budget_left / u.days_left, 1), 1) percent_daily_target, u.previous_day_spend / GREATEST(u.budget_left / u.days_left, 1) percent_daily_target_uncapped, GREATEST(LEAST(u.spend / u.expected_spend, 1), 0) pacing, GREATEST(u.spend / u.expected_spend, 0) pacing_uncapped, CASE WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 0 AND 0.25 THEN '1(0-25%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 0.26 AND 0.5 THEN '2(26-50%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 0.51 AND 0.75 THEN '3(51-75%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 0.76 AND 1 THEN '4(76-100%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 1.01 AND 1.25 THEN '5(101-125%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 1.26 AND 1.5 THEN '6(126-150%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 1.51 AND 1.75 THEN '7(151-175%)' WHEN ROUND(u.spend / u.expected_spend, 2) BETWEEN 1.76 AND 2 THEN '8(176-200%)' WHEN ROUND(u.spend / u.expected_spend, 2) > 2 THEN '9(200%+)' ELSE 'UNKNOWN' END pacing_breakout, u.clicks clicks, u.impressions impressions, u.ctr ctr, 1 ct FROM ( SELECT COALESCE(t.adv_trader, 'Unknown') adv_trader, COALESCE(t.io_trader, 'Unknown') io_trader, t.io_id io_id, t.io io, t.start_day start_day, t.end_day end_day, t.flight_days flight_days, t.days_left days_left, t.days_left / t.flight_days flight_percent_remaining, t.adv_id adv_id, t.advertiser advertiser, COALESCE(t.previous_day_spend, 0) previous_day_spend, MAX(t.budget) budget, SUM(t.spend) spend, MAX(t.budget) / t.flight_days daily_budget, t.flight_days - t.days_left days_passed, ( MAX(t.budget) / t.flight_days ) * ( t.flight_days - t.days_left ) expected_spend, MAX(t.budget) - SUM(t.spend) budget_left, MAX(t.impressions) impressions, MAX(t.clicks) clicks, MAX(t.clicks) / MAX(t.impressions) ctr FROM ( SELECT adv_budget.trader adv_trader, trader.trader io_trader, io.common_data.id io_id, io.common_data.NAME io, io.advertiser_id adv_id, adv.common_data.NAME advertiser, STRFTIME_UTC_USEC(io.scheduled_segments.start_time_usec, '%Y/%m/%d') start_day, STRFTIME_UTC_USEC(io.scheduled_segments.end_time_usec, '%Y/%m/%d') end_day, DATEDIFF(io.scheduled_segments.end_time_usec, io.scheduled_segments.start_time_usec) flight_days, GREATEST(DATEDIFF(io.scheduled_segments.end_time_usec, GREATEST(io.scheduled_segments.start_time_usec, INTEGER(NOW()))), 0 ) days_left, ( io.scheduled_segments.max_spend_advertiser_micros / 1000000 ) budget, spend.spend spend, pd.previous_day_spend previous_day_spend, spend.impressions impressions, spend.clicks clicks FROM FLATTEN([PARAMETER].Entity_InsertionOrder, scheduled_segments) io INNER JOIN [PARAMETER].Entity_Advertiser adv ON adv.common_data.id = io.advertiser_id LEFT JOIN ( SELECT Insertion_Order_ID io_id, SUM(Revenue) previous_day_spend FROM [PARAMETER].Pacing_Yesterday_Spend GROUP BY io_id) pd ON pd.io_id = io.common_data.id LEFT JOIN ( SELECT Advertiser_ID adv_id, Trader trader FROM [[PARAMETER].Pacing_Budget]) adv_budget ON adv_budget.adv_id = adv.common_data.id LEFT JOIN ( SELECT Trader trader, Insertion_Order_ID io_id FROM [[PARAMETER].Pacing_Traders]) trader ON trader.io_id = io.common_data.id CROSS JOIN ( SELECT Report_Day date, Insertion_Order_Id io_id, SUM(Impressions) impressions, SUM(Clicks) clicks, SUM(Revenue) spend FROM [PARAMETER].Pacing_Spend_Report WHERE Insertion_Order_ID IN ( SELECT common_data.id io_id FROM FLATTEN([[PARAMETER].Entity_InsertionOrder], scheduled_segments) WHERE NOW() BETWEEN scheduled_segments.start_time_usec AND scheduled_segments.end_time_usec GROUP BY io_id) GROUP BY date, io_id) spend WHERE io.common_data.id = spend.io_id AND spend.date BETWEEN STRFTIME_UTC_USEC(io.scheduled_segments.start_time_usec, '%Y/%m/%d') AND STRFTIME_UTC_USEC(io.scheduled_segments.end_time_usec, '%Y/%m/%d') AND NOW() BETWEEN io.scheduled_segments.start_time_usec AND io.scheduled_segments.end_time_usec) t GROUP BY adv_trader, io_trader, io_id, io, start_day, end_day, flight_days, t.flight_days, days_left, t.days_left, flight_percent_remaining, adv_id, advertiser, days_passed, previous_day_spend) u WHERE u.days_left > 0",
"parameters":[
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
]
}
}},
{ "bigquery": {
"hour":[6, 12],
"auth": "service",
"to": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_LI_Breakdown_Foundation"
},
"from": {
"query": "SELECT adv.common_data.id adv_id, adv.common_data.name adv, io.common_data.id io_id, io.common_data.name io, li_spend.li_id li_id, li_spend.li li, li_spend.spend spend, adv_budget.trader adv_trader, trader.trader io_trader FROM FLATTEN([PARAMETER].Entity_InsertionOrder, scheduled_segments) io INNER JOIN [PARAMETER].Entity_Advertiser adv ON io.advertiser_id = adv.common_data.id INNER JOIN ( SELECT Report_Day date, Insertion_Order_ID io_id, Line_Item_ID li_id, Line_Item li, FLOAT(Revenue) spend FROM [PARAMETER].Pacing_Spend_Report) li_spend ON io.common_data.id = li_spend.io_id LEFT JOIN ( SELECT Advertiser_ID adv_id, trader trader FROM [[PARAMETER].Pacing_Budget] ) adv_budget ON adv_budget.adv_id = adv.common_data.id LEFT JOIN ( SELECT Insertion_Order_ID io_id, Trader trader FROM [[PARAMETER].Pacing_Traders]) trader ON trader.io_id = io.common_data.id WHERE NOW() BETWEEN io.scheduled_segments.start_time_usec AND io.scheduled_segments.end_time_usec AND li_spend.date BETWEEN STRFTIME_UTC_USEC(io.scheduled_segments.start_time_usec, '%Y/%m/%d') AND STRFTIME_UTC_USEC(io.scheduled_segments.end_time_usec, '%Y/%m/%d')",
"parameters":[
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
]
}
}},
{ "bigquery": {
"hour":[6, 12],
"auth": "service",
"to": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_LI_Breakdown"
},
"from": {
"query": "SELECT li_spend.adv_trader adv_trader, li_spend.io_trader io_trader, li_spend.adv_id adv_id, li_spend.adv adv, li_spend.io_id io_id, li_spend.io io, li_spend.li_id li_id, li_spend.li li, li_spend.spend li_spend, io_spend.spend io_spend, li_yesterday_spend.yesterday_spend yesterday_spend, li.budget_cap budget_cap, li.pacing_cap pacing_cap, li.pacing_type pacing_type FROM ( SELECT adv_id, adv, io_id, io, li_id, li, adv_trader, io_trader, SUM(spend) spend FROM [PARAMETER].Pacing_LI_Breakdown_Foundation GROUP BY adv_id, adv, io_id, io, li_id, li, adv_trader, io_trader) li_spend INNER JOIN ( SELECT io_id, SUM(spend) spend FROM [PARAMETER].Pacing_LI_Breakdown_Foundation GROUP BY io_id) io_spend ON io_spend.io_id = li_spend.io_id INNER JOIN ( SELECT FLOAT(Revenue) yesterday_spend, Line_Item_ID li_id FROM [[PARAMETER].Pacing_Yesterday_Spend] ) li_yesterday_spend ON li_spend.li_id = li_yesterday_spend.li_id INNER JOIN ( SELECT common_data.id li_id, budget.pacing_max_spend_advertiser_micros / 1000000 pacing_cap, CASE WHEN budget.pacing_type = 0 THEN 'ASAP' WHEN budget.pacing_type = 1 THEN 'Daily' WHEN budget.pacing_type = 2 THEN 'Monthly' END pacing_type, budget.max_spend_advertiser_micros / 1000000 budget_cap FROM [[PARAMETER].Entity_LineItem] ) li ON li.li_id = li_spend.li_id",
"parameters":[
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
]
}
}},
{ "bigquery": {
"hour":[6, 12],
"auth": "service",
"to": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_Adv_Rollup"
},
"from": {
"query": "SELECT adv_budget.adv_id adv_id, adv_budget.adv_name adv_name, adv_budget.trader trader, quarter_info.quarter_budget quarter_budget, quarter_info.quarter_spend quarter_spend, quarter_info.quarter_spend / (quarter_info.quarter_budget * quarter_info.pct_quarter) quarter_pacing, year_info.year_spend year_spend, year_info.year_spend / (year_info.year_budget * year_info.pct_year) year_pacing, year_info.year_budget year_budget FROM ( SELECT Advertiser_ID adv_id, Advertiser adv_name, Trader trader FROM [PARAMETER].Pacing_Budget) adv_budget LEFT JOIN ( SELECT quarter_budget.adv_id adv_id, quarter_budget.quarter_budget quarter_budget, quarter_spend.quarter_spend quarter_spend, quarter_budget.pct_quarter pct_quarter FROM ( SELECT advertiser_ID adv_id, SUM(((scheduled_segments.max_spend_advertiser_micros) / 1000000) * ( DATEDIFF( USEC_TO_TIMESTAMP(LEAST( INTEGER(PARSE_UTC_USEC( CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '-03-31 23:59:59' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '-06-30 23:59:59' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '-09-30 23:59:59' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '-12-31 23:59:59' END)), INTEGER(scheduled_segments.end_time_usec))), USEC_TO_TIMESTAMP(GREATEST( INTEGER(PARSE_UTC_USEC( CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '-01-01 00:00:00' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '-04-01 00:00:00' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '-07-01 00:00:00' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '-10-01 00:00:00' END)), INTEGER(scheduled_segments.start_time_usec)) )) / DATEDIFF(scheduled_segments.end_time_usec, scheduled_segments.start_time_usec))) quarter_budget, ( DATEDIFF( NOW(), PARSE_UTC_USEC( CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '-01-01 00:00:00' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '-04-01 00:00:00' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '-07-01 00:00:00' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '-10-01 00:00:00' END)) / CASE WHEN QUARTER(NOW()) = 1 THEN DATEDIFF(PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-03-31 23:59:59'), PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-01-01 00:00:00')) WHEN QUARTER(NOW()) = 2 THEN DATEDIFF(PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-06-30 23:59:59'), PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-04-01 00:00:00')) WHEN QUARTER(NOW()) = 3 THEN DATEDIFF(PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-09-30 23:59:59'), PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-07-01 00:00:00')) WHEN QUARTER(NOW()) = 4 THEN DATEDIFF(PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-12-31 23:59:59'), PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-10-01 00:00:00')) END) pct_quarter FROM FLATTEN([PARAMETER].Entity_InsertionOrder, scheduled_segments) WHERE (STRFTIME_UTC_USEC(scheduled_segments.start_time_usec, '%Y%m%d') BETWEEN CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '0101' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '0401' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '0701' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '1001' END AND CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '0331' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '0630' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '0930' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '1231' END) OR (STRFTIME_UTC_USEC(scheduled_segments.end_time_usec, '%Y%m%d') BETWEEN CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '0101' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '0401' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '0701' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '1001' END AND CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '0331' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '0630' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '0930' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '1231' END) GROUP BY adv_id ) quarter_budget INNER JOIN ( SELECT SUM(FLOAT(spend.Revenue)) quarter_spend, adv.adv_id adv_id FROM [[PARAMETER].Pacing_Spend_Report] spend INNER JOIN ( SELECT common_data.id io_id, advertiser_id adv_id FROM [[PARAMETER].Entity_InsertionOrder] ) adv ON spend.Insertion_Order_ID = adv.io_id WHERE REPLACE(spend.Report_Day, '/', '') BETWEEN CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '0101' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '0401' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '0701' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '1001' END AND CASE WHEN QUARTER(NOW()) = 1 THEN STRING(YEAR(NOW())) + '0331' WHEN QUARTER(NOW()) = 2 THEN STRING(YEAR(NOW())) + '0630' WHEN QUARTER(NOW()) = 3 THEN STRING(YEAR(NOW())) + '0930' WHEN QUARTER(NOW()) = 4 THEN STRING(YEAR(NOW())) + '1231' END GROUP BY adv_id ) quarter_spend ON quarter_spend.adv_id = quarter_budget.adv_id) quarter_info ON quarter_info.adv_id = adv_budget.adv_id LEFT JOIN ( SELECT year_budget.adv_id adv_id, year_budget.year_budget year_budget, year_spend.year_spend year_spend, year_budget.pct_year pct_year FROM ( SELECT Advertiser_ID adv_id, SUM((scheduled_segments.max_spend_advertiser_micros / 1000000) * ( DATEDIFF( USEC_TO_TIMESTAMP(LEAST( INTEGER(PARSE_UTC_USEC( STRING(YEAR(NOW())) + '-12-31 23:59:59')), INTEGER(scheduled_segments.end_time_usec))), USEC_TO_TIMESTAMP(GREATEST( INTEGER(PARSE_UTC_USEC( STRING(YEAR(NOW())) + '-01-01 00:00:00')), INTEGER(scheduled_segments.start_time_usec)) )) / DATEDIFF(scheduled_segments.end_time_usec, scheduled_segments.start_time_usec))) year_budget, ( DATEDIFF( NOW(), PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-01-01 00:00:00')) / DATEDIFF(PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-12-31 23:59:59'), PARSE_UTC_USEC(STRING(YEAR(NOW())) + '-01-01 00:00:00'))) pct_year FROM FLATTEN([PARAMETER].Entity_InsertionOrder, scheduled_segments) WHERE STRFTIME_UTC_USEC(scheduled_segments.start_time_usec, '%Y%m%d') BETWEEN STRING(YEAR(NOW())) + '0101' AND STRING(YEAR(NOW())) + '3112' AND STRFTIME_UTC_USEC(scheduled_segments.end_time_usec, '%Y%m%d') BETWEEN STRING(YEAR(NOW())) + '0101' AND STRING(YEAR(NOW())) + '3112' GROUP BY adv_id ) year_budget INNER JOIN ( SELECT SUM(FLOAT(spend.Revenue)) year_spend, adv.adv_id adv_id FROM [[PARAMETER].Pacing_Spend_Report] spend INNER JOIN ( SELECT common_data.id io_id, advertiser_id adv_id FROM [[PARAMETER].Entity_InsertionOrder] ) adv ON spend.Insertion_Order_ID = adv.io_id WHERE REPLACE(spend.Report_Day, '/', '') BETWEEN STRING(YEAR(NOW())) + '0101' AND STRING(YEAR(NOW())) + '3112' GROUP BY adv_id ) year_spend ON year_spend.adv_id = year_budget.adv_id) year_info ON year_info.adv_id = adv_budget.adv_id WHERE quarter_spend IS NOT NULL",
"parameters":[
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
]
}
}},
{ "bigquery": {
"auth": "service",
"to": {
"dataset":{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
"table": "Pacing_View_Impressions"
},
"from": {
"query": "SELECT u.adv_trader adv_trader, u.io_trader io_trader, u.advertiser advertiser, u.io io, u.io_id io_id, u.days_passed days_passed, u.days_left days_left, GREATEST(u.impressions_left, 0) impressions_left, u.impressions impressions, u.budgeted_impressions budgeted_impressions, u.expected_impressions expected_impressions, GREATEST(u.expected_impressions - u.impressions, 0) impressions_behind, u.expected_impressions - u.impressions impressions_behind_uncapped, u.previous_day_impressions previous_day_impressions, GREATEST(u.impressions_left / u.days_left, 0) target_daily_impressions, u.impressions / u.days_passed avg_daily_impressions, LEAST(u.previous_day_impressions / GREATEST(u.impressions_left / u.days_left, 1), 1) percent_daily_target, GREATEST(LEAST(u.impressions / u.expected_impressions, 1), 0) pacing, u.impressions / u.expected_impressions pacing_uncapped, CASE WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 0 AND 0.25 THEN '1(0-25%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 0.26 AND 0.5 THEN '2(26-50%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 0.51 AND 0.75 THEN '3(51-75%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 0.76 AND 1 THEN '4(76-100%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 1.01 AND 1.25 THEN '5(101-125%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 1.26 AND 1.5 THEN '6(126-150%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 1.51 AND 1.75 THEN '7(151-175%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) BETWEEN 1.76 AND 2 THEN '8(176-200%)' WHEN ROUND(u.impressions / u.expected_impressions, 2) > 2 THEN '9(200%+)' ELSE 'UNKNOWN' END pacing_breakout, 1 ct FROM ( SELECT t.adv_trader adv_trader, t.io_trader io_trader, t.io_id io_id, t.io io, t.start_day start_day, t.end_day end_day, t.flight_days flight_days, t.days_left days_left, t.days_left / t.flight_days flight_percent_remaining, t.adv_id adv_id, t.advertiser advertiser, COALESCE(t.previous_day_impressions, 0) previous_day_impressions, MAX(t.budgeted_impressions) budgeted_impressions, SUM(t.impressions) impressions, MAX(t.budgeted_impressions) / t.flight_days daily_budgeted_impressions, t.flight_days - t.days_left days_passed, ( MAX(t.budgeted_impressions) / t.flight_days ) * ( t.flight_days - t.days_left ) expected_impressions, MAX(t.budgeted_impressions) - SUM(t.impressions) impressions_left FROM ( SELECT io.common_data.id io_id, io.common_data.NAME io, io.advertiser_id adv_id, adv.common_data.NAME advertiser, STRFTIME_UTC_USEC(io.scheduled_segments.start_time_usec, '%Y/%m/%d') start_day, STRFTIME_UTC_USEC(io.scheduled_segments.end_time_usec, '%Y/%m/%d') end_day, DATEDIFF(io.scheduled_segments.end_time_usec, io.scheduled_segments.start_time_usec) flight_days, GREATEST(DATEDIFF(io.scheduled_segments.end_time_usec, GREATEST(io.scheduled_segments.start_time_usec, INTEGER(NOW()))), 0 ) days_left, io.scheduled_segments.max_impressions budgeted_impressions, spend.impressions impressions, pd.impressions previous_day_impressions, adv_budget.trader adv_trader, trader.trader io_trader FROM FLATTEN([PARAMETER].Entity_InsertionOrder, scheduled_segments) io INNER JOIN [PARAMETER].Entity_Advertiser adv ON adv.common_data.id = io.advertiser_id LEFT JOIN ( SELECT insertion_order_id io_id, SUM(FLOAT(impressions)) impressions FROM [PARAMETER].Pacing_Yesterday_Spend GROUP BY io_id) pd ON pd.io_id = io.common_data.id LEFT JOIN ( SELECT Advertiser_ID adv_id, Trader trader FROM [[PARAMETER].Pacing_Budget]) adv_budget ON adv_budget.adv_id = adv.common_data.id LEFT JOIN ( SELECT Trader trader, Insertion_Order_ID io_id FROM [[PARAMETER].Pacing_Traders]) trader ON trader.io_id = io.common_data.id CROSS JOIN ( SELECT Report_Day date, insertion_order_id io_id, SUM(impressions) impressions FROM [PARAMETER].Pacing_Spend_Report WHERE Insertion_Order_ID IN ( SELECT common_data.id io_id FROM FLATTEN([[PARAMETER].Entity_InsertionOrder], scheduled_segments) WHERE NOW() BETWEEN scheduled_segments.start_time_usec AND scheduled_segments.end_time_usec GROUP BY io_id) GROUP BY date, io_id) spend WHERE io.common_data.id = spend.io_id AND io.scheduled_segments.max_impressions IS NOT NULL AND spend.date BETWEEN STRFTIME_UTC_USEC(io.scheduled_segments.start_time_usec, '%Y/%m/%d') AND STRFTIME_UTC_USEC(io.scheduled_segments.end_time_usec, '%Y/%m/%d') AND NOW() BETWEEN io.scheduled_segments.start_time_usec AND io.scheduled_segments.end_time_usec) t GROUP BY io_id, io, start_day, end_day, flight_days, t.flight_days, days_left, t.days_left, flight_percent_remaining, adv_id, advertiser, days_passed, adv_trader, io_trader, previous_day_impressions) u WHERE u.days_left > 0 AND u.days_passed > 0",
"parameters":[
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }},
{"field":{ "name":"dataset", "kind":"string", "description":"Place where tables will be created in BigQuery." }}
]
}
}}
]
}