利用PowerQuery控制数据行数_PowerQuery

PowerBI报表在开发的过程中,经常会遇到数据量非常庞大的情况,在这种情况下,本机连接数据源如果不进行特殊处理的话,那么刷新数据的时候可能会发生数据刷新时间过长、数据加载内存错误、开发过程中构建DAX卡顿等情况。

那么在实际开发中,我们应该如何处理呢?其实,在PowerQuery页面,我们可以对查询进行过滤处理的。

在PowerQuery中进行过滤处理,我们需要区分两种情况,一种是可以在连接数据源时构建SQL语句的,一种是不可以的,感兴趣的小伙伴可以翻阅官方文档关于查询折叠[1]的相关内容,这里就不赘述了。

案例:可构建SQL语句

白茶在本机搭建了一个临时的SQL Server数据库,我们来连接该数据库中的某张表。

利用PowerQuery控制数据行数_PowerBI_02

结果如下:

利用PowerQuery控制数据行数_PowerBI_03


利用PowerQuery控制数据行数_数据库_04

在管理参数的面板下,我们需要创建如下参数:

利用PowerQuery控制数据行数_SQL_05


利用PowerQuery控制数据行数_数据库_06


利用PowerQuery控制数据行数_PowerBI_07

接下来,我们来构建一个空查询

利用PowerQuery控制数据行数_PowerQuery_08

将如下PQ代码,通过高级编辑器,复制进去:

let Sources = if LimitValidity then " TOP " & "(" & Limit & ")" else "" in Sources

结果如下:

利用PowerQuery控制数据行数_PowerBI_09

现在,我们可以对之前的连接到的表进行过滤处理了,进入到高级编辑器,修改其PQ代码:

let
    源 = Sql.Database(".", "CaseData", [Query="SELECT" & UseingFilter & " * FROM Fact_Sales "])
in
    源

结果如下:

利用PowerQuery控制数据行数_SQL_10

案例:不可构建SQL语句

因为环境的关系,白茶本地没有相对应的数据库,还是用SQL Server来给大家举例。

继续连接到刚才的表:

利用PowerQuery控制数据行数_PowerBI_11

我们重新创建一个空查询,将如下代码粘贴进去:

(x) => let Sources = if LimitValidity then Table.FirstN(x, Number.From(Limit)) else x in Sources

利用PowerQuery控制数据行数_SQL_12

修改FactSales的PQ代码:

let
    源 = Sql.Databases("."),
    CaseData = 源{[Name="CaseData"]}[Data],
    dbo_Fact_Sales = CaseData{[Schema="dbo",Item="Fact_Sales"]}[Data],
    UseingTop = UseingTop(dbo_Fact_Sales)
in
    UseingTop

结果如下:

利用PowerQuery控制数据行数_PowerQuery_13

云端设置

当我们完成本地开发工作,将报表发布到云端后,还需要调整参数,才能保证后续数据正常刷新。

在云端数据集设置中,找到参数设置,将LimitValidity参数修改为False即可。

利用PowerQuery控制数据行数_数据库_14

注意事项

  • 在连接数据库的时候,切忌SELECT * 这种操作,因为会查询到一些无用列;
  • 表查询调整后,会出现运行此本机数据库查询需要权限 这个提示,点击编辑权限后,点击运行即可;
  • 本地在刷新数据时,受限于本机电脑的配置以及登录账号,量级较大的数据在本地无法刷新;
  • 云端根据高级容量的不同配置,可以满足不同场景下的大规模数据刷新;
  • 针对不同的数据库,查询用语也是不同的,例如:SQL Server支持TOP函数,而MySql则支持Limit函数,白茶这里仅是提供一种思路给到大家。
引用链接

[1] 查询折叠: https://learn.microsoft.com/zh-cn/power-query/query-folding-basics

利用PowerQuery控制数据行数_SQL_15

利用PowerQuery控制数据行数_PowerQuery_16