Skip to content
Back to Blog
1 min read

Power BI 2022 Features: What's New and Exciting

I wrote “Power BI 2022 Features: What’s New and Exciting” to share practical, production-minded guidance on this topic.

Composite Models - Connect Everything

Composite models allow you to combine DirectQuery and Import mode in a single dataset:

// Create a calculated table for hybrid scenarios
SalesWithBudget =
NATURALINNERJOIN(
    SUMMARIZE(Sales, Sales[ProductID], Sales[Date], "TotalSales", SUM(Sales[Amount])),
    Budget  // Import mode table
)

Configure in Power BI Desktop:

{
  "model": {
    "tables": [
      {
        "name": "Sales",
        "mode": "directQuery",
        "source": {
          "type": "sql",
          "connectionString": "Server=sql.database.windows.net;Database=SalesDB"
        }
      },
      {
        "name": "Budget",
        "mode": "import",
        "source": {
          "type": "excel",
          "path": "Budget2022.xlsx"
        }
      }
    ],
    "relationships": [
      {
        "from": "Sales[ProductID]",
        "to": "Budget[ProductID]"
      }
    ]
  }
}

DirectQuery for Power BI Datasets

Chain datasets together with DirectQuery:

// Connect to another Power BI dataset
let
    Source = PowerBI.Datasets(null),
    SalesDataset = Source{[Name="Sales Analytics"]}[Data],
    SalesTable = SalesDataset{[Name="Sales"]}[Data]
in
    SalesTable

Hybrid Tables

Combine real-time and historical data in a single table:

{
  "name": "SalesHybrid",
  "partitions": [
    {
      "name": "Historical",
      "mode": "import",
      "source": {
        "expression": "SELECT * FROM Sales WHERE Date < '2022-01-01'"
      },
      "refreshPolicy": {
        "type": "incremental",
        "incrementalWindow": "30 days"
      }
    },
    {
      "name": "Current",
      "mode": "directQuery",
      "source": {
        "expression": "SELECT * FROM Sales WHERE Date >= '2022-01-01'"
      }
    }
  ]
}

Automatic Aggregations

Let Power BI optimize query performance automatically:

{
  "model": {
    "tables": [
      {
        "name": "SalesDetail",
        "aggregations": {
          "enabled": true,
          "trainingWindow": "30 days",
          "excludedColumns": ["CustomerNotes", "InternalID"]
        }
      }
    ]
  }
}

Monitor aggregation usage:

// Check aggregation hit ratio
EVALUATE
SUMMARIZE(
    INFO.AGGREGATIONS(),
    [TableName],
    [AggregationTableName],
    [HitRatio],
    [QueryCount]
)

Smart Narratives

Add AI-generated insights to your reports:

{
  "visualType": "smartNarrative",
  "dataRoles": [
    {
      "name": "Values",
      "values": ["Sales[Amount]", "Sales[Quantity]"]
    },
    {
      "name": "Category",
      "values": ["Product[Category]"]
    }
  ],
  "settings": {
    "summaryType": "autoSummarize",
    "includeOutliers": true,
    "highlightTrends": true
  }
}

Goals and Scorecards

Track KPIs with the new Goals feature:

{
  "scorecard": {
    "name": "Sales Performance 2022",
    "goals": [
      {
        "name": "Revenue Target",
        "owner": "sales-team@company.com",
        "target": 10000000,
        "startDate": "2022-01-01",
        "endDate": "2022-12-31",
        "current": {
          "datasetId": "sales-dataset",
          "measure": "Total Revenue"
        },
        "status": {
          "rules": [
            { "condition": ">=100%", "status": "OnTrack", "color": "green" },
            { "condition": ">=80%", "status": "AtRisk", "color": "yellow" },
            { "condition": "<80%", "status": "Behind", "color": "red" }
          ]
        }
      }
    ]
  }
}

Deployment Pipelines API

Automate report deployments:

import requests

class PowerBIDeploymentPipeline:
    def __init__(self, access_token: str):
        self.base_url = "https://api.powerbi.com/v1.0/myorg"
        self.headers = {
            "Authorization": f"Bearer {access_token}",
            "Content-Type": "application/json"
        }

    def deploy_to_stage(self, pipeline_id: str, source_stage: int, target_stage: int):
        """Deploy content from one stage to another."""
        url = f"{self.base_url}/pipelines/{pipeline_id}/deployAll"

        payload = {
            "sourceStageOrder": source_stage,
            "options": {
                "allowCreateArtifact": True,
                "allowOverwriteArtifact": True,
                "allowOverwriteTargetArtifactLabel": True
            }
        }

        response = requests.post(url, headers=self.headers, json=payload)
        return response.json()

    def get_pipeline_operations(self, pipeline_id: str):
        """Get deployment history."""
        url = f"{self.base_url}/pipelines/{pipeline_id}/operations"
        response = requests.get(url, headers=self.headers)
        return response.json()

# Usage
pipeline = PowerBIDeploymentPipeline(access_token)
result = pipeline.deploy_to_stage(
    pipeline_id="pipeline-guid",
    source_stage=0,  # Development
    target_stage=1   # Test
)

Enhanced Paginated Reports

<!-- Paginated report with parameters -->
<Report>
  <ReportParameters>
    <ReportParameter Name="StartDate">
      <DataType>DateTime</DataType>
      <DefaultValue>
        <Values>
          <Value>=DateAdd("m", -1, Today())</Value>
        </Values>
      </DefaultValue>
    </ReportParameter>
  </ReportParameters>
  <DataSets>
    <DataSet Name="SalesData">
      <Query>
        <CommandText>
          SELECT * FROM Sales
          WHERE Date >= @StartDate
        </CommandText>
      </Query>
    </DataSet>
  </DataSets>
</Report>

Power BI in 2022 offers unprecedented flexibility for enterprise analytics with features that scale from simple reports to complex enterprise deployments.\n\n## Takeaways\n\nAdd a concise, personal takeaway and recommended next steps here.\n

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.