Power BI 新函数 RANK 和 ROWNUM 的一些个人理解

202304 Power BI 更新了两个窗口函数(RANK 和 ROWNUM),为了加强理解继续与 sqlserver 的窗口函数对比来学习。需要注意的是以下演示使用的 Power BI 版本是 2023年4月 

1 函数语法

RANK ( [<Ties>] [, <Relation>] [, <OrderBy>] [, <Blanks>] [, <PartitionBy>] )

ROWNUMBER ( [<Relation>] [, <OrderBy>] [, <Blanks>] [, <PartitionBy>] )

这两个新的窗口函数参数语法基本与 WINDOW 函数一致,有兴趣的可以翻看 WINDOW函数 ,值得注意就是RANK中的 <Ties> 默认是 SKIP, 简单理解就是窗口中用来排名的值去不去重,默认是不去重。DESC 就是去重。举个例子,5个人3个成绩,分别是99,99,98,98,97。不去重就是以这5个成绩进行排名,结果是1,1,3,3,5。去重就是以去重的结果进行排名1,1,2,2,3。

2 数据源-粘贴到 Power BI 模型中去,并将两表产品键值构建关系。

Dim_Product
品牌产品名称产品键值
品牌A产品11
品牌A产品22
品牌A产品33
品牌A产品44
品牌B产品55
品牌B产品66
品牌B产品77
品牌B产品88
品牌B产品99
Fact_Sales
产品键值数量
162
390
731
588
292
762
624
354
279
370
356
673
329
546
955
461
196
297
877
555
320
569

3 DAX 表达式 - 需要使用 DAX STUDIO

EVALUATE
VAR OriginalQuery =
    SUMMARIZE (
        Fact_Sales,
        Dim_Product[品牌],
        Dim_Product[产品名称],
        "数量", SUM ( Fact_Sales[数量] )
    )
VAR WindowsQuery =
    ADDCOLUMNS (
	  OriginalQuery,
      "窗口SKIP排名", 
      RANK ( SKIP, OriginalQuery, ORDERBY ( [数量], ASC ) ),
      "组内SKIP排名", 
      RANK ( SKIP, OriginalQuery, ORDERBY ( [数量], ASC ), PARTITIONBY ( [品牌] ) ),
      "窗口DENSC排名", 
      RANK ( DENSE, OriginalQuery, ORDERBY ( [数量], ASC ) ),
      "组内DENSC排名", 
      RANK ( DENSE, OriginalQuery, ORDERBY ( [数量], ASC ), PARTITIONBY ( [品牌] ) ),
      "排序后窗口行号", 
      ROWNUMBER ( OriginalQuery, ORDERBY ( [数量], ASC ) ),
      "排序后组内行号", 
      ROWNUMBER ( OriginalQuery, ORDERBY ( [数量], ASC ), PARTITIONBY ( [品牌] ) )
    )
RETURN
    WindowsQuery
ORDER BY
	[数量] ASC

 DAX 结果 

 4 sqlserver 查询

SELECT
  OriginalQuery.品牌
  ,OriginalQuery.产品名称
  ,数量
  ,Rank()
     OVER(
       ORDER BY OriginalQuery.数量 ASC) 窗口SKIP排名
  ,Rank()
     OVER(
       PARTITION BY OriginalQuery.品牌
       ORDER BY OriginalQuery.数量 ASC) 组内SKIP排名
  ,Dense_rank()
     OVER(
       ORDER BY OriginalQuery.数量 ASC) 窗口DENSE排名
  ,Dense_rank()
     OVER(
       PARTITION BY OriginalQuery.品牌
       ORDER BY OriginalQuery.数量 ASC) 组内DENSE排名
  ,Row_number()
     OVER(
       ORDER BY OriginalQuery.数量 ASC) 排序后窗口行号
  ,Row_number()
     OVER(
       PARTITION BY OriginalQuery.品牌
       ORDER BY OriginalQuery.数量 ASC) 排序后组内行号
FROM   (SELECT
          Dim_Product.品牌
          ,Dim_Product.产品名称
          ,Sum(Fact_Sales.数量) 数量
        FROM   Fact_Sales
               LEFT JOIN Dim_Product
                      ON Dim_Product.产品键值 = Fact_Sales.产品键值
        GROUP  BY
         Dim_Product.品牌
         ,Dim_Product.产品名称) OriginalQuery
ORDER  BY
  数量 ASC 

SQL 结果 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值