Below is an example of a query that can be used to analyze users that execute jobs billed to a given project.
The common table expression jobs_agg can be modified as needed. Choose an appropriate source view: JOBS_BY_PROJECT, JOBS_BY_ORGANIZATION, or an archive of one of these. Modify the filters as needed.
with
jobs_agg as
(
select
j.job_type
,j.user_email
,min(j.creation_time) as min_creation_time
,max(j.creation_time) as max_creation_time
,count(*) as job_count
,sum(j.total_slot_ms) as total_slot_ms
-- from `PROJECT_ID.region-us.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION` j
-- from `PROJECT_ID.region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT` j
-- default to this query's billing project
from `region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT` j
where
-- JOBS_BY_ tables partitioned on creation_time by day;
-- creation_time is UTC and current_date defaults to UTC
date(j.creation_time) between
date_add(
current_date
,interval -30 day
)
and current_date
group by
j.job_type
,j.user_email
)
select
j.job_type
,j.user_email
,format_timestamp(
'%Y-%m-%d %H:%M:%E*S'
,j.min_creation_time
) as min_creation_time
,format_timestamp(
'%Y-%m-%d %H:%M:%E*S'
,j.max_creation_time
) as max_creation_time
,j.job_count
,cast(j.job_count as float64)
/ sum(j.job_count) over (
partition by
j.job_type
)
as job_count_pct
,coalesce(
j.total_slot_ms
,0
) as total_slot_ms
,cast(j.total_slot_ms as float64)
/ sum(j.total_slot_ms) over (
partition by
j.job_type
)
as total_slot_ms_pct
from jobs_agg j
order by
j.job_type
,j.total_slot_ms desc
,j.job_count desc
,j.user_email
;