# JIRA BUGS - table comes from jira_issues_agg_daily ```sql= WITH jira_issue_agg_task AS ( SELECT * FROM `crewmeister-projects.jira_corrected.jira_issues_agg_task` where project_id = 10006 #CREW project only ), /* compute the increase and decrease in jira objects based on the creation date and resolution date respectively */ objects_inc_daily AS ( SELECT DATE(created_time) AS date, COUNTIF(issuetype_id=10000) AS epics_inc, COUNTIF(issuetype_id=10001) AS stories_inc, COUNTIF(issuetype_id=10002) AS tasks_inc, COUNTIF(issuetype_id=10003) AS subtasks_inc, COUNTIF(issuetype_id=10004) AS bugs_inc, FROM jira_issue_agg_task #where resolution_id not in (10001, 10002, 10003) #(resolution_id = 10000 # OR resolution_id = 0) #count only "Done" resolutions and not the "Won't Do", "Cannot Reproduce",... # AND status_id <> -1 #exclude the ones that are excluded in the Jira Exception Sheet (manually entered exceptions) GROUP BY DATE(created_time)), objects_dec_daily AS ( SELECT DATE(resolution_time) AS date, COUNTIF(issuetype_id=10000 AND status_id=10002) AS epics_dec, COUNTIF(issuetype_id=10001 AND status_id=10002) AS stories_dec, COUNTIF(issuetype_id=10002 AND status_id=10002) AS tasks_dec, COUNTIF(issuetype_id=10003) AS subtasks_dec, COUNTIF(issuetype_id=10004 AND (status_id=10002 or status_id=-1)) AS bugs_dec, FROM jira_issue_agg_task GROUP BY DATE(resolution_time)), /* combine both inc and dec in jira objects daily. Then compute the difference and the number of bugs open at date. */ issues_agg_daily_with_inc_dec AS ( SELECT date, ifnull(objects_inc_daily.epics_inc, 0) AS epics_inc, ifnull(objects_inc_daily.stories_inc, 0) AS stories_inc, ifnull(objects_inc_daily.tasks_inc, 0) AS tasks_inc, ifnull(objects_inc_daily.subtasks_inc, 0) AS subtasks_inc, ifnull(objects_inc_daily.bugs_inc, 0) AS bugs_inc, ifnull(objects_dec_daily.epics_dec, 0) AS epics_dec, ifnull(objects_dec_daily.stories_dec, 0) AS stories_dec, ifnull(objects_dec_daily.tasks_dec, 0) AS tasks_dec, ifnull(objects_dec_daily.subtasks_dec, 0) AS subtasks_dec, ifnull(objects_dec_daily.bugs_dec, 0) AS bugs_dec, FROM UNNEST(GENERATE_DATE_ARRAY(DATE("2020-03-01"), DATE_ADD(current_date, INTERVAL 367 day), INTERVAL 1 DAY)) AS date LEFT JOIN objects_inc_daily ON DATE(objects_inc_daily.date) = date LEFT JOIN objects_dec_daily ON DATE(objects_dec_daily.date) = date), issues_agg_daily_with_inc_dec_diff_open AS ( SELECT *, epics_inc-epics_dec AS epics_diff, stories_inc-stories_dec AS stories_diff, tasks_inc-tasks_dec AS tasks_diff, subtasks_inc-subtasks_dec AS subtasks_diff, bugs_inc-bugs_dec AS bugs_diff, SUM(epics_inc-epics_dec) OVER(ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS epics_open, SUM(stories_inc-stories_dec) OVER(ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS stories_open, SUM(tasks_inc-tasks_dec) OVER(ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS tasks_open, SUM(subtasks_inc-subtasks_dec) OVER(ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS subtasks_open, SUM(bugs_inc-bugs_dec) OVER(ORDER BY date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS bugs_open, FROM issues_agg_daily_with_inc_dec) SELECT * FROM issues_agg_daily_with_inc_dec_diff_open ``` ```sql= WITH /* select the corrected versions of jira_issues and jira_issues_history with manual exceptions in the respective google sheets */ jira_issues AS ( SELECT * FROM `crewmeister-projects.jira_corrected.jira_issues_corrected` where project_id=10006), jira_issues_history AS ( SELECT * FROM `crewmeister-projects.jira_corrected.jira_issues_history_corrected` where issue_key like "%CREW%"), /* select the relevant fields for efficient computations */ jira_issues_selection AS ( SELECT issue_id, issue_key, issuetype_id, issuetype_name, priority_id, priority_name, project_id, project_key, created_time, resolution_id, resolution_name, resolution_time, status_id, status_name, story_points, #parents informations parent_issue_id, parent_issue_key, parent_issuetype_id, parent_issuetype_name, issue_summary, FROM jira_issues), /* unnest the jira_issues array information information for each issue. We cannot unnest every field in a single query since the unnesting is at different nest-precision levels */ jira_issues_sprint_name AS ( SELECT issue_id, issue_key, ARRAY_AGG(sprints.item.id) AS sprint_id, ARRAY_AGG(sprints.item.name) AS sprint_name, FROM jira_issues, UNNEST(sprint.list) AS sprints GROUP BY issue_id, issue_key), jira_issues_label_name AS ( SELECT issue_id, issue_key, ARRAY_AGG(labels.item) AS label_name, FROM jira_issues, UNNEST(fields_labels.list) AS labels GROUP BY issue_id, issue_key), jira_issues_fixVersions AS ( SELECT issue_id, issue_key, ARRAY_AGG(fixVersions.item.id) AS fixVersions_id, ARRAY_AGG(fixVersions.item.name) AS fixVersions_name, FROM jira_issues, UNNEST(fields_fixVersions.list) AS fixVersions GROUP BY issue_id, issue_key), jira_issues_selection_with_array_data AS ( SELECT jira_issues_selection.*, jira_issues_sprint_name.sprint_id, jira_issues_sprint_name.sprint_name, jira_issues_label_name.label_name, jira_issues_fixVersions.fixVersions_name, jira_issues_fixVersions.fixVersions_id, FROM jira_issues_selection LEFT JOIN jira_issues_sprint_name ON jira_issues_selection.issue_id = jira_issues_sprint_name.issue_id LEFT JOIN jira_issues_label_name ON jira_issues_selection.issue_id = jira_issues_label_name.issue_id LEFT JOIN jira_issues_fixVersions ON jira_issues_selection.issue_id = jira_issues_fixVersions.issue_id), /* select relevant fields from jira_issues_history for efficient compuations */ jira_issues_history_selection AS ( SELECT DISTINCT issue_id, issue_key, history_id, created_time, field, field_id, from_id, from_string, to_id, to_string, FROM jira_issues_history), /* compute the implementation date for each issue (when the respective first sub-level element is moved to implementation at least once).*/ jira_issues_history_implementation_time AS ( SELECT DISTINCT jira_issues_history_selection.issue_id, jira_issues_history_selection.issue_key, MIN( IF (to_id=10016, jira_issues_history_selection.created_time, NULL)) OVER(PARTITION BY jira_issues_history_selection.issue_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS implementation_time, jira_issues_selection.parent_issue_id, jira_issues_selection.parent_issue_key, MIN( IF (to_id=10016, jira_issues_history_selection.created_time, NULL)) OVER(PARTITION BY jira_issues_selection.parent_issue_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS parent_implementation_time, FROM jira_issues_selection LEFT JOIN jira_issues_history_selection ON jira_issues_selection.issue_id = jira_issues_history_selection.issue_id), /* add the implementation date and time metrics to the jira_issues_selection data*/ jira_issues_selection_with_array_data_and_implementation_time AS ( SELECT jira_issues_selection_with_array_data.*, ifnull(child_implementation_time_table.implementation_time, ifnull(parent_implementation_time_table.parent_implementation_time, current_timestamp)) AS implementation_time, FROM jira_issues_selection_with_array_data LEFT JOIN jira_issues_history_implementation_time child_implementation_time_table ON jira_issues_selection_with_array_data.issue_id = child_implementation_time_table.issue_id LEFT JOIN ( SELECT DISTINCT parent_issue_id, parent_implementation_time FROM jira_issues_history_implementation_time) parent_implementation_time_table ON jira_issues_selection_with_array_data.issue_id = parent_implementation_time_table.parent_issue_id), /* compute time columns and then correct them for the blocker-bug exception case */ jira_issues_selection_times_uncorrected AS ( SELECT *, TIMESTAMP_DIFF(implementation_time, created_time, second) AS waiting_time, TIMESTAMP_DIFF(resolution_time, implementation_time, second) AS lead_time, TIMESTAMP_DIFF(resolution_time, created_time, second) AS life_time, FROM jira_issues_selection_with_array_data_and_implementation_time), jira_issues_selection_times AS ( SELECT *EXCEPT(waiting_time, lead_time, life_time), CASE WHEN priority_id = 1 THEN 0 #priority_id= "Blocker" WHEN waiting_time < 0 THEN 0 ELSE waiting_time END AS waiting_time, CASE WHEN priority_id = 1 THEN life_time #priority_id= "Blocker" WHEN lead_time < 0 THEN 0 ELSE lead_time END AS lead_time, CASE WHEN life_time < 0 THEN 0 ELSE life_time END AS life_time, FROM jira_issues_selection_times_uncorrected) SELECT * FROM jira_issues_selection_times ```