前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全网首发 Power BI DAX 纯原生高性能分页矩阵

全网首发 Power BI DAX 纯原生高性能分页矩阵

作者头像
BI佐罗
发布2021-03-25 12:00:06
2.5K0
发布2021-03-25 12:00:06
举报
文章被收录于专栏:PowerBI战友联盟PowerBI战友联盟

在 Power BI 中显示一个大型的表,并不擅长,因为 Power BI 更倾向于制作高度聚合的可视化图表,但如果就是希望做到可以显示大篇幅的分页表格怎么办呢?本文就是来给出答案的。

背景说明

先看效果吧:

这是一个拥有上千笔订单的表格,用户只想看其中的一部分,并通过分页实现。这里要实现的动态效果包括三点:

  • 用户可以自主决定每页多少行数
  • 用户可以自主决定要显示的页码
  • 表格要进行标识当前所在的行数

另外,以该案例为例,表格的显示应该依据具体的一个列排序,当出现重复值的时候,依然可以平滑处理。在本案例中,是按照订单日期排序的,但会出现订单日期一样的订单,它们的排名是不同的,被有效错开了。

当然,最最重要的是:该解决方案必须具有通用性。

很显然,以上全部已经实现。

实现方法

该控件的实现方法非常巧妙。大致思路如下:

  • 先给出动态可选的页面控件,表现为:两个切片器。
  • 再给出表格是否在某个页面的判断,用度量值作为表格的筛选器。
  • 再计算行号。

根据这个实现思路就可以逐步来构建这个通用方法了。

分页控件的构造

可以用以下 DAX 构建分页控件如下:

代码语言:javascript
复制
PageControl = 

// 请设置三个参数

VAR vOptionNumber     = 10  // 有多少种每页行数的选择
VAR vUnit             = 5   // 行数变化的单位基数
VAR vTotalPageNumber  = 100 // 页面数

// 以下代码无需修改

RETURN 

GENERATEALL( 
    ADDCOLUMNS( 
        SELECTCOLUMNS( GENERATESERIES( 1 , vOptionNumber ) , "OptionNumber" , [Value] ) , 
        "RowsPerPage" , [OptionNumber] * vUnit ,
        "RowsPerPageName" , [OptionNumber] * vUnit & " 行/页"
    ) ,

    VAR vIDList =
        SELECTCOLUMNS( 
            GENERATESERIES( 1 , vTotalPageNumber * [RowsPerPage] , 1 ) , "Row" , [Value]
        )
        
    VAR vPageList =
        ADDCOLUMNS( 
            vIDList , 
            "PageNumber" , INT( ( [Row] - 1 ) /  [RowsPerPage]) + 1 ,
            "PageName"   , "第 " & INT( ( [Row] - 1 ) /  [RowsPerPage] ) + 1 & " 页" 
        )

    RETURN vPageList
)

这是一个模板,用户仅仅只需要改变参数设置,就可以自动完成。

用度量值做筛选判断

用度量值做筛选在很多场景中,其实是一个重要的技巧,这里正好用到这个技巧,如下:

关键是如何构建这个度量值,用 DAX 实现如下:

代码语言:javascript
复制
PageControl.IsInPage = 

VAR vRowMin = MIN( PageControl[Row] )
VAR vRowMax = MAX( PageControl[Row] )

VAR vCurrentValue =
    SELECTCOLUMNS( SUMMARIZE( 'Order' , 'Order'[OrderDate] , 'Order'[OrderID] ) , 
        "@Value" , FORMAT( [OrderDate] , "yyMMdd" ) & [OrderID]
    )

RETURN SWITCH( TRUE() ,
    vCurrentValue > 
    MAXX( 
        TOPN( 
            vRowMax , 
            SELECTCOLUMNS( 
                ALL( 'Order'[OrderDate] , 'Order'[OrderID] ) , 
                "@Value" , FORMAT( [OrderDate] , "yyMMdd" ) & [OrderID] 
            ) , [@Value] , ASC ) , 
        [@Value] 
    ) , "No" ,

    vCurrentValue < 
    MAXX( 
        TOPN( 
            vRowMin , 
            SELECTCOLUMNS( 
                ALL( 'Order'[OrderDate] , 'Order'[OrderID] ) , 
                "@Value" , FORMAT( [OrderDate] , "yyMMdd" ) & [OrderID] 
            ) , [@Value] , ASC ) , 
        [@Value] 
    ) , "No" ,

    "Yes" 
)

没有错,根据业务逻辑中的按照订单日期进行排序,在排序相同时这里巧妙地借用订单号来进一步比较,就可以确保排序的唯一性了。

显示行号

对当前的表格显示行号也是非常重要的,用 DAX 实现度量值如下:

代码语言:javascript
复制
PageControl.RowNumber = 

VAR vRowNumberStartInPage = MIN( PageControl[Row] )

VAR vCurrentValue =
    SELECTCOLUMNS( SUMMARIZE( 'Order' , 'Order'[OrderDate] , 'Order'[OrderID] ) , 
        "@Value" , FORMAT( [OrderDate] , "yyMMdd" ) & [OrderID]
    )

VAR vTableView =

CALCULATETABLE(

    ADDCOLUMNS(
        SUMMARIZE( 'Order' , 'Order'[OrderDate] , 'Order'[OrderID] ) ,
        "@Value" , FORMAT( [OrderDate] , "yyMMdd" ) & [OrderID]
    ) 
    ,
    ALLSELECTED( )

)

RETURN vRowNumberStartInPage + RANKX( vTableView , [@Value] , vCurrentValue , ASC ) - 1

没有错,这里用到了我们全网首发的 Power BI DAX 视图层计算技巧,并借助页面信息,将计算仅仅控制在一个页面的范围,进一步降低运算量级,提升性能。

总结

通过掌握《BI 真经》, 也就掌握了 DAX 思考问题的真谛,用《BI 真经》打好的坚实基础的确可以超越 Power BI 本身的限制,尽量将可塑性很强的 DAX 发挥到极限。本案例方法非常巧妙,但还有两个点要进一步思考:

  • 其实对于大型表格的显示会遇到密集计算的问题进而导致性能问题,本案例源文件已经用额外的技巧破除了一些限制,但这里限于篇幅就不再展开。
  • 本案例仅仅展示了按照基表的列进行排序分页的情况,如果是按照度量值的大小来排序,要做一定调整。

这两个问题就留给读者进一步探索了。您大可复制粘贴上述 DAX 表达式来实现强大的通用分页控件。如果您还没有坚实的 DAX 基础,赶快系统化学习起来吧。

顶级技巧合集

在订阅了BI佐罗讲授的《BI真经》之《BI进行时》课程区,除了可以下载本文案例,还可以观看视频讲解。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI战友联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景说明
  • 实现方法
  • 分页控件的构造
  • 用度量值做筛选判断
  • 显示行号
  • 总结
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档