Select Board, get current (or recent) sprint

Ultimate goal: have a shared Pages filter on a dashboard where board is selected, then a burn down chart is populated with the active sprint for that board. Another burn down is populated with the most recent sprint for that board. A third table is populated with future sprints’ data (this table I have working fine).

I’m having trouble finding a way to get this to work. I’ve combed through several community threads, and I have yet to determine the appropriate solution. Everything I have seen or attempted still requires the sprint itself to be selected, not just the board. I’m a newb, so I will likely have follow up questions. Any help would be much appreciated.

You would like to use Sprint dimension on Rows and on Pages for this report. You can use Board selection on the Pages and show Sprints on Rows.

In addition to this setup, you would like to add a filter to rows to get either the currently active sprint or recently closed sprint.

Report on active sprint for a selected board
You can define and use a measure representing sprint status to get the option filter by active status.
[Sprint].CurrentHierarchyMember.Get('Status')

Add this measure to the report and use the option Filter rows for this Sprint status with the selection Matches and value “Active”.
See how I updated the burndown chart for the currently active sprint based on the board selection:

Pro-tip on the above report. You can start it from the current Sample report. Switch to Year instead of Days before making any changes (otherwise, you can get either timeout or out of memory error).

  1. After you set the time level to Year add sprint dimension to Rows and add it to Pages from there.
  2. Add measure Sprint Status to the report and add a filter for active sprints.
  3. Select a particular board on Pages and use Sprint level on Rows.
  4. After you made those changes switch back to the Day level on the Time dimension.

Report on last closed sprint for a selected board
You can use a similar approach using Sprint dimension on Rows and on pages for a board selection. However, in this case, you would like to use a different measure as a filter. You would like to create a new measure using the measure Last closed sprints by board in a tuple with time default member to get it working on a timeline. I defined a measure Last closed sprints:

([Measures].[Last closed sprints by boards],
 [Time].CurrentHierarchy.DefaultMember)

Then add this measure to the report, add the filter rows for it = 1. Use the same steps to modify the report as mentioned above for the active sprint report.

After adding a measure as a filter in the report, you can remove the measure from the report. Filters will remain.

Daina / support@eazybi.com

1 Like

Thank you! I will give this a shot!

Thank you @daina.tupule for tips creating this. It is working fine, but slow in my case.

I have very similar use case where I need three different sprint reports in a single dashboard:

  1. Sprint Burn-down of last closed sprint
  2. All issues details of last closed sprint
  3. All issues details in active sprint
    Sprint board is in the common filter section and sets the tone for the three reports.

I’ve attached the export of #2 report. I have ~20 different sprint boards with >4 years of historical sprint data, so queries are slow or throwing exception. Any tips making it more efficient?

FYI: I’m trying to avoid using time dimension to filter down the data set, as Time is used in other dashboard’s reports. It may undesirably affect other reports behaviour.

{
  "cube_name": "Issues",
  "cube_reports": [ {
     "name": "Last Sprint",
     "folder_name": "PI Status",
     "result_view": "table",
     "definition": {"columns":{"dimensions":[{"name":"Measures","selected_set":["[Measures].[Committed or added]","[Measures].[Sprint Story Points at closing]","[Measures].[Sprint issue status at closing]","[Measures].[Issue type]","[Measures].[Epic name]","[Measures].[Issue fix versions]"],"members":[]}]},"rows":{"dimensions":[{"name":"Sprint","selected_set":["[Sprint].[AP Scrum]"],"selected_set_expression":"DescendantsSet({{selected_set}}, [Sprint].[Sprint])","members":[],"bookmarked_members":[]},{"name":"Issue","selected_set":["[Issue].[Issue].Members"],"members":[],"bookmarked_members":[]}],"order_by":{"expression":["[Measures].[Closed sprint issue sorting]"],"order":"DESC"},"filter_by":{"conditions":[{"expression":["[Measures].[Sprint issues at closing]"],"operator":"\u003e","value":"0"},{"expression":["[Measures].[Issue type]"],"operator":"\u003c\u003e","value":"Sub-task"},{"expression":["[Measures].[Last closed sprints by boards]"],"operator":"=","value":"1"},{"expression":["[Measures].[Issue type]"],"operator":"\u003c\u003e","value":"Bug"}],"others":false},"nonempty_crossjoin":true},"pages":{"dimensions":[{"name":"Sprint","duplicate":true,"selected_set":["[Sprint].[SS Scrum]","[Sprint].[SE Boards]","[Sprint].[All Sprints]"],"members":[{"depth":0,"name":"SE Boards","full_name":"[Sprint].[SE Boards]","calculated":true,"drillable":true,"dimension":"Sprint","expanded":true,"drilled_into":false,"removed":true},{"depth":0,"name":"All Sprints","full_name":"[Sprint].[All Sprints]","drillable":true,"type":"all","expanded":true,"drilled_into":false},{"depth":1,"name":"AP Scrum","full_name":"[Sprint].[AP Scrum]","drillable":true,"parent_full_name":"[Sprint].[All Sprints]"}],"bookmarked_members":[],"current_page_members":["[Sprint].[AP Scrum]"]}]},"options":{"nonempty":true},"view":{"current":"table","maximized":false,"table":{"cell_formatting":{"[Measures].[Sprint issue status at closing]":{"type":"range","whole_row":true,"rules":[{"min":"Closed","background_color":"#34AD70","max":"Closed"},{"min":"In Progress","background_color":"#FFD04D","max":"In Progress"},{"min":"In Review","background_color":"#FFD04D","max":"In Review"},{"min":"In QA","background_color":"#FFD04D","max":"In QA"},{"min":"Acceptance","background_color":"#FFD04D","max":"Acceptance"},{"min":"QA In Progress","max":"QA In Progress","background_color":"#FFD04D"},{"min":"Blocked","background_color":"#D4153B","max":"Blocked"},{"min":"Ready","background_color":"#D4153B","max":"Ready"},{"background_color":"#D4153B","min":"Backlog","max":"Backlog"},{"min":"Open","max":"Open","background_color":"#D4153B"},{"min":"On Hold","max":"On Hold","background_color":"#D4153B"},{"min":"Elaboration","max":"Elaboration","background_color":"#D4153B"}]}}}},"calculated_members":[]}
  } ],
  "calculated_members": [{"dimension":"Measures","name":"Issue type","format_string":"","formula":"[Issue Type].[Issue Type].getMemberNameByKey(\n  [Issue].CurrentHierarchyMember.get('Issue type ID')\n)"},{"dimension":"Measures","name":"Issue fix versions","format_string":"","formula":"[Fix Version].[Version].getMemberNamesByKeys(\n  [Issue].CurrentHierarchyMember.get('Fix version IDs')\n)"},{"name":"Issue Epic Link","dimension":"Measures","formula":"[Issue].CurrentHierarchyMember.get('Epic Link')","format_string":""},{"name":"Issue Epic Name","dimension":"Measures","formula":"[Issue].CurrentHierarchyMember.get('Epic Name')","format_string":""},{"name":"Last closed sprints by boards","dimension":"Measures","format_string":"","formula":"CASE\nWHEN\n  ([Measures].[Issues created],\n  [Sprint].CurrentHierarchyMember.Parent) \u003e 0\nTHEN\n  NonZero(\n    Rank(\n      [Sprint].CurrentHierarchyMember,\n      Order(\n        Filter(\n          [Sprint].CurrentHierarchyMember.Parent.Children,\n          NOT isEmpty([Sprint].CurrentHierarchyMember.Get('Start date'))\n          AND [Sprint].CurrentHierarchyMember.GetBoolean('Closed')\n        ),\n      [Sprint].CurrentHierarchyMember.Get('Start date'), DESC)\n    )\n  )\nEND\n"},{"name":"Sprint Story Points at closing","dimension":"Measures","format_string":"#,##0.00","formula":"-- Story points from issues when a sprint was closed\n( [Measures].[Story Points added],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Closed],\n  [Issue Sprint Status Change].[Active =\u003e Closed]\n)\n"},{"name":"Sprint issues committed","dimension":"Measures","format_string":"#,##0","formula":"( [Measures].[Transitions to],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Active],\n  -- An issue was in a sprint at a sprint start time\n  [Issue Sprint Status Change].[Future =\u003e Active]\n)\n"},{"name":"Sprint issues added","dimension":"Measures","format_string":"#,##0","formula":"( [Measures].[Transitions to],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Active],\n  -- An issue was added or created in an active sprint\n  [Issue Sprint Status Change].[(none) =\u003e Active]\n)\n"},{"name":"Sprint issues at closing","dimension":"Measures","format_string":"#,##0","formula":"( [Measures].[Transitions to],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Closed],\n  -- An issue was in a sprint at closing\n  [Issue Sprint Status Change].[Active =\u003e Closed]\n)\n"},{"name":"Sprint issue status at closing","dimension":"Measures","formula":"Generate(\n Filter([Transition status].[Transition status].Members, \n [Measures].[Sprint issues at closing]\u003e0),\n [Transition status].CurrentMember.Name\n )","format_string":""},{"name":"Committed or added","dimension":"Measures","formula":"CASE WHEN [Measures].[Sprint issues committed] \u003e 0\n    THEN \"Committed\"\n  ELSE \n    CASE WHEN [Measures].[Sprint issues added] \u003e 0 \n      THEN \"Added\"\n  END\nEND","format_string":""},{"name":"Closed sprint issue sorting","dimension":"Measures","formula":"[Measures].[Committed or added] || \" \" || Format([Measures].[Sprint Story Points at closing], '000.0')","format_string":""},{"name":"Epic name","dimension":"Measures","formula":"CASE WHEN [Measures].[Issue type] = \"Epic\"\nTHEN --for epics return Epic Name\n  CoalesceEmpty([Measures].[Issue Epic Name],\"\")\nELSE -- for other issues return linked Epic Name\n  [Issue].[Issue].GetMemberByKey(\n    [Measures].[Issue Epic Link]\n  ).Get('Epic Name')\nEND","format_string":""},{"name":"SE Boards","dimension":"Sprint","formula":"Aggregate({\n  [Sprint].[SS Scrum],\n  [Sprint].[PL Scrum],\n  [Sprint].[ME Scrum],\n  [Sprint].[AP Scrum],\n  [Sprint].[WI Scrum],\n  [Sprint].[WC Scrum],\n  [Sprint].[DS Scrum],\n  [Sprint].[JX Scrum],\n  [Sprint].[JS Scrum Board],\n  [Sprint].[MO Scrum],\n  [Sprint].[EM Scrum],\n  [Sprint].[JA Scrum],\n  [Sprint].[CO Scrum],\n  [Sprint].[CT Scrum]\n})","format_string":""}]
}

Thanks in advance.

It seems you might have a lot of data imported into the account. More than 20 boards with 4 year sprint data will include many issues the team worked on. Therefore, the report with sprints and issues in the rows might be slow.

The report has several filters eazyBI will apply on any sprint and issue combination of a selected board. This makes the main impact on the slowness of the report.

I would suggest importing some additional details for sprints to support faster filtering.
For example, you can import the Last closed sprint rank = descending order identifier of closed sprints within a board. Then use it in the reports instead of Last closed sprints by boards. An imported property will work faster than a calculation.

Source definition example for Last closed sprint rank
{
  "application_type": "rest_api",
  "application_params": {
    "source_params": {
      "url": "JIRA_HOME/rest/agile/1.0/board?type=scrum",
      "pagination": "offset_limit",
      "incremental": null,
      "incremental_stop_import": null,
      "authentication_type": "basic",
      "username": "",
      "content_type": "json",
      "custom_javascript_code": "// retrieves all sprints from specified boards and will go from the last sprint and rank decreasingly closed sprints\nvar sprints = [{\n  board_id: doc.id,\n  sprint_id: null,\n  sprint_last_closed: null \n}];\nvar boardList = [13,14,15];\nvar allClosedSprints = [];\nvar allSprintsLoaded = false;\nstartAt = 0;\nmaxResult = 50;\nif (doc.type == \"scrum\" && boardList.indexOf(doc.id) >-1) {\n  do \n  {\n    result = getDocument( \"/rest/agile/1.0/board/\" + doc.id + \"/sprint?state=closed&startAt=\" + startAt + \"&maxResults=\" + maxResult, {ignoreErrors: [404]});\n    if (result && result.values ) {\n      allClosedSprints = allClosedSprints.concat(result.values);\n      allSprintsLoaded = result.isLast;\n      startAt = startAt + maxResult;\n    }\n  }\n  while (!allSprintsLoaded); \n  \n  if (allClosedSprints ) { \n  j = 1;\n  for(var i = allClosedSprints.length-1; i>= 0; i--) {\n    doc.i = i;\n    var sprint = allClosedSprints[i];\n    if (sprint && sprint.state.equals(\"closed\")) {\n      sprints.push({\n        board_id: doc.id,\n        sprint_id: sprint.id,\n        sprint_last_closed: j\n      })\n      j ++;\n   }\n  }\n} \n\n}\nreturn sprints;",
      "json_data_path": "$.values",
      "offset_parameter": "startAt",
      "limit_parameter": "maxResults",
      "limit_value": 50,
      "request_method": "get",
      "page_parameter": "page",
      "page_parameter_in_body": null,
      "offset_parameter_in_body": null,
      "limit_parameter_in_body": null
    },
    "extra_options": {
      "regular_import_frequency": null,
      "regular_import_at": "",
      "time_zone": "Helsinki"
    }
  },
  "source_cube_name": "Issues",
  "columns": [
    {
      "name": "board_id",
      "data_type": "integer",
      "dimension": "Sprint",
      "dimension_level": "Board",
      "key_column": true,
      "skip_missing": true
    },
    {
      "name": "sprint_id",
      "data_type": "integer",
      "dimension": "Sprint",
      "dimension_level": "Sprint",
      "key_column": true,
      "skip_missing": true
    },
    {
      "name": "sprint_last_closed",
      "data_type": "integer",
      "dimension": "Sprint",
      "dimension_level": "Sprint",
      "property": "Last closed rank"
    }
  ]
}

You can add a new source in your account by importing the definition shared above. You might need an assistance from a user with data source access permissions or Jira admin for this step.

Please make changes for this source to match your setup:

  1. Update the JIRA_HOME to your Jira base URL
  2. Add the username and password
  3. Edit JavaScript code and update the parameter boardList and list your board ids instead of example board ids 13,14,15. If you would like to know the imported board ids, you can use the example report shared below to see imported board ids.
  4. Run an import for this source to get the new property Sprint Last closed rank.
Report definition Board ids
{
  "cube_name": "Issues",
  "cube_reports": [ {
     "name": "Board IDS (eazyBI support)",
     "folder_name": "PI Status",
     "result_view": "table",
     "definition": {"columns":{"dimensions":[{"name":"Measures","selected_set":["[Measures].[Sprint or Board key]"],"members":[{"depth":0,"full_name":"[Measures].[Sprint or Board key]","format_string":"","report_specific":true,"name":"Sprint or Board key","calculated":true}]}]},"rows":{"dimensions":[{"name":"Sprint","selected_set":["[Sprint].[All Sprints]"],"selected_set_expression":"DescendantsSet({{selected_set}}, [Sprint].[Board])","members":[],"bookmarked_members":[]}],"nonempty_crossjoin":false},"pages":{"dimensions":[{"name":"Sprint","duplicate":true,"selected_set":["[Sprint].[SS Scrum]","[Sprint].[All Sprints]"],"members":[{"depth":0,"name":"All Sprints","full_name":"[Sprint].[All Sprints]","drillable":true,"type":"all","expanded":true,"drilled_into":false}],"bookmarked_members":[],"current_page_members":["[Sprint].[All Sprints]"]}]},"options":{},"view":{"current":"table","maximized":false,"table":{"cell_formatting":{}}},"calculated_members":[{"dimension":"Measures","name":"Sprint or Board key","formula":"[Sprint].CurrentMember.Key","format_string":""}]}
  } ],
  "calculated_members": []
}

Here is how this report looks to me. I used board ids 13,14,15 from this report.

The next step would be using this newly imported property in the report filter. I added it in the report instead of the current last closed sprint by boards. I also created two new report specific measures to filter issues in this sprint and a different measure for sorting as well.

Here is an updated report Last Sprint (eazyBI support) definition:
{
    "calculated_members": [
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "[Issue Type].[Issue Type].getMemberNameByKey(\n  [Issue].CurrentHierarchyMember.get('Issue type ID')\n)",
            "name": "Issue type"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "[Fix Version].[Version].getMemberNamesByKeys(\n  [Issue].CurrentHierarchyMember.get('Fix version IDs')\n)",
            "name": "Issue fix versions"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "[Issue].CurrentHierarchyMember.get('Epic Link')",
            "name": "Issue Epic Link"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "[Issue].CurrentHierarchyMember.get('Epic Name')",
            "name": "Issue Epic Name"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "[Sprint].[Sprint].getMemberNamesByKeys(\n  [Issue].CurrentHierarchyMember.get('Sprint IDs')\n)\n",
            "name": "Issue Sprints"
        },
        {
            "dimension": "Measures",
            "format_string": "#,##0.00",
            "formula": "-- Story points from issues when a sprint was closed\n( [Measures].[Story Points added],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Closed],\n  [Issue Sprint Status Change].[Active => Closed]\n)\n",
            "name": "Sprint Story Points at closing"
        },
        {
            "dimension": "Measures",
            "format_string": "#,##0",
            "formula": "( [Measures].[Transitions to],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Active],\n  -- An issue was in a sprint at a sprint start time\n  [Issue Sprint Status Change].[Future => Active]\n)\n",
            "name": "Sprint issues committed"
        },
        {
            "dimension": "Measures",
            "format_string": "#,##0",
            "formula": "( [Measures].[Transitions to],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Active],\n  -- An issue was added or created in an active sprint\n  [Issue Sprint Status Change].[(none) => Active]\n)\n",
            "name": "Sprint issues added"
        },
        {
            "dimension": "Measures",
            "format_string": "#,##0",
            "formula": "( [Measures].[Transitions to],\n  [Transition Field].[Sprint status],\n  [Sprint Status].[Closed],\n  -- An issue was in a sprint at closing\n  [Issue Sprint Status Change].[Active => Closed]\n)\n",
            "name": "Sprint issues at closing"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "Generate(\n Filter([Transition status].[Transition status].Members, \n [Measures].[Sprint issues at closing]>0),\n [Transition status].CurrentMember.Name\n )",
            "name": "Sprint issue status at closing"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "CASE WHEN [Measures].[Sprint issues committed] > 0\n    THEN \"Committed\"\n  ELSE \n    CASE WHEN [Measures].[Sprint issues added] > 0 \n      THEN \"Added\"\n  END\nEND",
            "name": "Committed or added"
        },
        {
            "dimension": "Measures",
            "format_string": "",
            "formula": "CASE WHEN [Measures].[Issue type] = \"Epic\"\nTHEN --for epics return Epic Name\n  CoalesceEmpty([Measures].[Issue Epic Name],\"\")\nELSE -- for other issues return linked Epic Name\n  [Issue].[Issue].GetMemberByKey(\n    [Measures].[Issue Epic Link]\n  ).Get('Epic Name')\nEND",
            "name": "Epic name"
        },
        {
            "dimension": "Sprint",
            "format_string": "",
            "formula": "Aggregate({\n  [Sprint].[SS Scrum],\n  [Sprint].[PL Scrum],\n  [Sprint].[ME Scrum],\n  [Sprint].[AP Scrum],\n  [Sprint].[WI Scrum],\n  [Sprint].[WC Scrum],\n  [Sprint].[DS Scrum],\n  [Sprint].[JX Scrum],\n  [Sprint].[JS Scrum Board],\n  [Sprint].[MO Scrum],\n  [Sprint].[EM Scrum],\n  [Sprint].[JA Scrum],\n  [Sprint].[CO Scrum],\n  [Sprint].[CT Scrum]\n})",
            "name": "SE Boards"
        },
        {
            "dimension": "Measures",
            "format_string": "#,##0",
            "formula": "[Sprint].CurrentHierarchyMember.get('Last closed rank')",
            "name": "Sprint Last closed rank"
        }
    ],
    "cube_name": "Issues",
    "cube_reports": [
        {
            "definition": {
                "calculated_members": [
                    {
                        "dimension": "Measures",
                        "format_string": "",
                        "formula": "CASE WHEN\n[Measures].[Sprint Last closed rank] = 1\nAND\n[Measures].[Issue Sprints] MATCHES \".*\" || [Sprint].CurrentMember.Name || \".*\"\nTHEN\nNonEmptyString(IIF (\n  [Measures].[Sprint issues at closing] > 0, \n  [Measures].[Committed or added] || \" \" || Format([Measures].[Sprint Story Points at closing], '000.0'), \n  \"\"\n))\nEND",
                        "name": "Sort"
                    },
                    {
                        "dimension": "Measures",
                        "format_string": "",
                        "formula": "CASE WHEN\n[Measures].[Sprint Last closed rank] = 1\nAND\n[Measures].[Issue Sprints] MATCHES \".*\" || [Sprint].CurrentMember.Name || \".*\"\nTHEN\n [Measures].[Sprint issues at closing]\nEND",
                        "name": "Filter"
                    }
                ],
                "columns": {
                    "dimensions": [
                        {
                            "members": [],
                            "name": "Measures",
                            "selected_set": [
                                "[Measures].[Committed or added]",
                                "[Measures].[Sprint Story Points at closing]",
                                "[Measures].[Sprint issue status at closing]",
                                "[Measures].[Issue type]",
                                "[Measures].[Epic name]",
                                "[Measures].[Issue fix versions]"
                            ]
                        }
                    ]
                },
                "options": {},
                "pages": {
                    "dimensions": [
                        {
                            "bookmarked_members": [],
                            "current_page_members": [
                                "[Sprint].[AP Scrum]"
                            ],
                            "duplicate": true,
                            "members": [
                                {
                                    "calculated": true,
                                    "depth": 0,
                                    "dimension": "Sprint",
                                    "drillable": true,
                                    "drilled_into": false,
                                    "expanded": true,
                                    "full_name": "[Sprint].[SE Boards]",
                                    "name": "SE Boards",
                                    "removed": true
                                },
                                {
                                    "depth": 0,
                                    "drillable": true,
                                    "drilled_into": false,
                                    "expanded": true,
                                    "full_name": "[Sprint].[All Sprints]",
                                    "name": "All Sprints",
                                    "type": "all"
                                },
                                {
                                    "depth": 1,
                                    "drillable": true,
                                    "full_name": "[Sprint].[AP Scrum]",
                                    "name": "AP Scrum",
                                    "parent_full_name": "[Sprint].[All Sprints]"
                                }
                            ],
                            "name": "Sprint",
                            "selected_set": [
                                "[Sprint].[SS Scrum]",
                                "[Sprint].[SE Boards]",
                                "[Sprint].[All Sprints]"
                            ]
                        }
                    ]
                },
                "rows": {
                    "dimensions": [
                        {
                            "bookmarked_members": [],
                            "members": [],
                            "name": "Sprint",
                            "selected_set": [
                                "[Sprint].[AP Scrum]"
                            ],
                            "selected_set_expression": "DescendantsSet({{selected_set}}, [Sprint].[Sprint])"
                        },
                        {
                            "bookmarked_members": [],
                            "members": [],
                            "name": "Issue",
                            "selected_set": [
                                "[Issue].[Issue].Members"
                            ]
                        }
                    ],
                    "filter_by": {
                        "conditions": [
                            {
                                "expression": [
                                    "[Measures].[Issue type]"
                                ],
                                "operator": "<>",
                                "value": "Sub-task"
                            },
                            {
                                "expression": [
                                    "[Measures].[Issue type]"
                                ],
                                "operator": "<>",
                                "value": "Bug"
                            },
                            {
                                "expression": [
                                    "[Measures].[Sprint Last closed rank]"
                                ],
                                "operator": "=",
                                "value": "1"
                            },
                            {
                                "expression": [
                                    "[Measures].[Filter]"
                                ],
                                "operator": ">=",
                                "value": "1"
                            }
                        ],
                        "others": false
                    },
                    "nonempty_crossjoin": true,
                    "order_by": {
                        "expression": [
                            "[Measures].[Sort]"
                        ],
                        "order": "DESC"
                    }
                },
                "view": {
                    "current": "table",
                    "maximized": false,
                    "table": {
                        "cell_formatting": {
                            "[Measures].[Sprint issue status at closing]": {
                                "rules": [
                                    {
                                        "background_color": "#34AD70",
                                        "max": "Closed",
                                        "min": "Closed"
                                    },
                                    {
                                        "background_color": "#FFD04D",
                                        "max": "In Progress",
                                        "min": "In Progress"
                                    },
                                    {
                                        "background_color": "#FFD04D",
                                        "max": "In Review",
                                        "min": "In Review"
                                    },
                                    {
                                        "background_color": "#FFD04D",
                                        "max": "In QA",
                                        "min": "In QA"
                                    },
                                    {
                                        "background_color": "#FFD04D",
                                        "max": "Acceptance",
                                        "min": "Acceptance"
                                    },
                                    {
                                        "background_color": "#FFD04D",
                                        "max": "QA In Progress",
                                        "min": "QA In Progress"
                                    },
                                    {
                                        "background_color": "#D4153B",
                                        "max": "Blocked",
                                        "min": "Blocked"
                                    },
                                    {
                                        "background_color": "#D4153B",
                                        "max": "Ready",
                                        "min": "Ready"
                                    },
                                    {
                                        "background_color": "#D4153B",
                                        "max": "Backlog",
                                        "min": "Backlog"
                                    },
                                    {
                                        "background_color": "#D4153B",
                                        "max": "Open",
                                        "min": "Open"
                                    },
                                    {
                                        "background_color": "#D4153B",
                                        "max": "On Hold",
                                        "min": "On Hold"
                                    },
                                    {
                                        "background_color": "#D4153B",
                                        "max": "Elaboration",
                                        "min": "Elaboration"
                                    }
                                ],
                                "type": "range",
                                "whole_row": true
                            }
                        }
                    }
                }
            },
            "folder_name": "PI Status",
            "name": "Last Sprint (eazyBI support)",
            "result_view": "table"
        }
    ]
}

You can use this newly imported property Sprint Last closed rank in other reports instead of Last closed sprints by board when Board is used on Pages.

Daina / support@eazybi.com

1 Like

@daina.tupule, your suggested solution for optimizing the Last Sprint report worked perfectly performance wise. If the sprint closed rank measure will shift once an active sprint is closed, then this is the solution I was looking for. I noticed one caveat with the report specific measure Filter where you use MATCH function for sprint name. We used “(”, “)” symbols for some teams sprint names, so had to rename those, which solved the issue.

This brings me closer to where I want to be. Can you also recommend an optimized solution for the Active Sprint report? I will use both reports in the same dashboard, so the Active Sprint report should use selected Board name and find the active sprint from there. The report I am currently using is performing equally slow and is based on this measure

CASE
WHEN
  ([Measures].[Issues created],
  [Sprint].CurrentHierarchyMember.Parent) > 0
THEN
  NonZero(
    Rank(
      [Sprint].CurrentHierarchyMember,
      Order(
        Filter(
          [Sprint].CurrentHierarchyMember.Parent.Children,
          NOT isEmpty([Sprint].CurrentHierarchyMember.Get('Start date'))
          AND [Sprint].CurrentHierarchyMember.get('Status') = "Active"
        ),
      [Sprint].CurrentHierarchyMember.Get('Start date'), DESC)
    )
  )
END

As I understand, I need to add custom JavaScript calculation in the newly created JIRA REST API datasource…

I can provide Active Sprint report export if needed.

Thanks in advance.

It seems you are using a modified formula of Last Closed Sprints to get the Active sprints. Typically there is only one active sprint in the board. I would suggest using a default property Status to get the Active Sprint of the board.

You can define and use this formula to get the Sprint Status:

[Sprint].CurrentHierarchyMember.Get('Status')

Add it to the report and add a filter = Active. Then remove the measure itself from the report. The filter should remain.

Daina / support@eazybi.com

@daina.tupule, Sprint Status measure solved performance issue. Thank you!