当前位置: 首页 > news >正文

BI技巧丨Window应用之同环比

白茶曾介绍过OFFSET可以用来解决同环比的问题,其实微软最近推出的开窗函数WINDOW也可以用来解决同环比。

WINDOW函数基础语法

WINDOW ( from[, from_type], to[, to_type][, <relation>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>] )

参数介绍:

from:表示窗口开始的位置,正负数均可,可以是固定值,也可以是DAX表达式。

from_type:修改from行为,有两个选项ABS(绝对位置)和REL(相对位置)。

to:表示窗口结束的位置,正负数均可,可以是固定值,也可以是DAX表达式。

to_type:修改to行为,有两个选项ABS(绝对位置)和REL(相对位置)。

relation:表表达式,后续参数orderby,partitionby,matchby的内部参数,都需要来自它或相关表。

orderby:可选项,排序依据。

blanks:可选项,保留参数,可以忽略。

partitionby:可选项,分区定义,参照SQL的开窗分区即可。

matchby:可选项,定义匹配数据和标识当前行的列的语句。

PS:

from和to的1代表向后移动一行,-1代表向前移动一行,0代表当前位置。

其他参数与OFFSET和INDEX函数一致,这里就不过多介绍了。

接下来我们搭配应用场景来看一下如何使用WINDOW函数。

先来看看本期的案例数据:

案例数据就一张Sales的销售事实表,表结构也相对简单,将其导入到PowerBI中。

添加如下日期表,并建立模型关系。

Date = 
GENERATE (CALENDAR ( MIN ( 'Sales'[DATE] ), MAX ( 'Sales'[DATE] ) ),VAR DA = [Date]VAR YEAR =YEAR ( DA )VAR QUARTER ="Q" & FORMAT ( DA, "Q" )VAR MONTE =FORMAT ( DA, "MM" )VAR DAY =DAY ( DA )RETURNROW ("Year", YEAR,"Quarter", QUARTER,"Month", MONTE,"DayOfMonth", DAY,"YearQuarter", YEAR & QUARTER,"YearMonth", YEAR & MONTE,"YearMonthCount",YEAR * 12 + MONTE   ----新增列)
)

模型关系如下:

添加如下基础度量值:

销售数量:

Quantity =
SUM ( Sales[Quantity] )

环比:

Offset环比% = 
VAR LastMonth =CALCULATE ( [Quantity], OFFSET ( -1, ALL ( 'Date'[Year], 'Date'[YearMonth] ) ) )
RETURNDIVIDE ( [Quantity] - LastMonth, LastMonth )

同比:

Offset同比% = 
VAR LastYear =CALCULATE ( [Quantity], OFFSET ( -12, ALL ( 'Date'[Year], 'Date'[YearMonth] ) ) )
RETURNDIVIDE ( [Quantity] - LastYear, LastYear )

这是我们之前利用OFFSET函数的写法,结果如下:

有了WINDOW函数,我们还可以这么写:

环比:

Window环比% = 
VAR LastYear =CALCULATE ([Quantity],WINDOW ( -1, REL, -1, REL, ALL ( 'Date'[Year], 'Date'[YearMonth] ) ))
RETURNDIVIDE ( [Quantity] - LastYear, LastYear )

同比:

Window同比% = 
VAR LastYear =CALCULATE ([Quantity],WINDOW ( -12, REL, -12, REL, ALL ( 'Date'[Year], 'Date'[YearMonth] ) ))
RETURNDIVIDE ( [Quantity] - LastYear, LastYear )

结果如下:

二者结果是一致的。

从执行性能上来看,OFFSET函数的效果是最优的。

无论是对比之前的时间智能函数的写法,还是对比日期表加列的写法,包括本期对比WINDOW函数的写法,OFFSET在同环比计算上的速度都是最优的。

而WINDOW函数,因为有from和to两个定位值,因此性能上面对比OFFSET是有损耗的。

http://www.lryc.cn/news/141627.html

相关文章:

  • 【Mac】编译Spring 源码和Idea导入
  • 手把手教你用 ANSYS workbench
  • Kotlin开发笔记:协程基础
  • 自学设计模式(简单工厂模式、工厂模式、抽象工厂模式)
  • NFS:使⽤ NFS 为远程客户端提供共享文件系统
  • 2022-kaggle-nlp赛事:Feedback Prize - English Language Learning(超多注释讲解)
  • 第十三课 宾语从句
  • Docker容器与虚拟化技术:GitHub账户注册
  • thinkphp安装workman
  • L1-036 A乘以B(Python实现) 测试点全过
  • 代码随想录第五十三天
  • cmd - 如何在不重启的情况下让修改后的hosts生效
  • echarts实现双x轴并且分组滚动效果
  • UE4 地形编辑基础知识 学习笔记
  • AcWing算法提高课-5.5.2最大公约数
  • Kubernetes-CKA考题详解
  • 不同版本.net引用同一个项目
  • 软件开发企业SDL安全培训案例
  • ide-eval-resetter jar包下载、源码、使用介绍
  • 数据压缩算法一览
  • 使用Rust开发命令行工具
  • CentOS中Oracle11g进程有哪些
  • WebRTC之FEC前向纠错协议
  • 软件测试技术分享丨使用Postman搞定各种接口token实战
  • GBU812-ASEMI逆变器专用整流桥GBU812
  • D2007在64位Win7出现 delphi 2007 assertion failure thread32.cpp 的解决办法
  • windows10 docker 安装在D盘
  • Scikit-learn强化学习代码批注及相关练习
  • 执行jmeter端口不够用报错(Address not available)
  • 【Go Web 篇】从零开始:构建最简单的 Go 语言 Web 服务器