BI技巧丨利用OFFSET计算同环比
微软最近更新了很多开窗函数,其内部参数对比以往的DAX函数来说,多了很多,这就导致学习的时间成本直线上升。
而且对于新增函数的应用场景,很多小伙伴也是一知半解的,本期我们就来聊一聊关于最近新增的开窗函数——OFFSET函数。
OFFSET函数基础语法
OFFSET ( <delta>[, <relation>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>] )
参数介绍:
delta:偏移量,正负数均可,可以是固定值,也可以是DAX表达式。
relation:表表达式,后续参数orderby,partitionby,matchby的内部参数,都需要来自它或相关表。
orderby:可选项,排序依据。
blanks:可选项,保留参数,可以忽略。
partitionby:可选项,分区定义,参照SQL的开窗分区即可。
matchby:可选项,定义匹配数据和标识当前行的列的语句。
PS:看到这里是不是有点晕?别慌,记住前2个参数即可,足以满足大部分应用场景。
接下来我们搭配应用场景来看一下如何使用OFFSET函数。
先来看看本期的案例数据:
案例数据就一张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] )
环比:
Count环比% =
VAR CurrentCount =SELECTEDVALUE ( 'Date'[YearMonthCount] )
VAR LastMonthCount = CurrentCount - 1
VAR LastMonthValue =CALCULATE ([Quantity],FILTER ( ALL ( 'Date' ), 'Date'[YearMonthCount] = LastMonthCount ))
VAR Result =DIVIDE ( [Quantity] - LastMonthValue, LastMonthValue )
RETURNResult
同比:
Count同比% =
VAR CurrentCount =SELECTEDVALUE ( 'Date'[YearMonthCount] )
VAR LastYearMonthCount = CurrentCount - 12
VAR LastYearMonthValue =CALCULATE ([Quantity],FILTER ( ALL ( 'Date' ), 'Date'[YearMonthCount] = LastYearMonthCount ))
VAR Result =DIVIDE ( [Quantity] - LastYearMonthValue, LastYearMonthValue )
RETURNResult
结果如下:
到这里,我们的准备工作结束。
这是我们以往计算同环比时,白茶比较喜欢的写法之一。
开窗函数出来之后,我们可以换一种写法。
环比:
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 )
结果如下:
从结果上看,二者是一致的,都没有太大的问题,但是从写法上看,开窗函数的写法无疑是简洁了很多。
代码解释:
1.OFFSET返回的结果为表,因此可以利用此特性,搭配CALCULATE使用;
2.利用第1参数偏移量,可以向前偏移1个月,或者多个月;
3.第2参数的设定,可以根据当前上下文设定,因为环比涉及到跨年问题,所以需要将年份字段添加进去。
我们来看一下执行性能:
从性能分析窗口,我们不难看出,开窗函数对比之前的写法,无疑是优化了很多。
除了前两个参数以外,我们来看看orderby的用法。
添加如下代码:
Orderby用法 =
CALCULATE ([Quantity],OFFSET (-1,ALL ( 'Date'[Year], 'Date'[YearMonth] ),ORDERBY ( [Quantity], DESC ))
)
结果如下:
从结果上我们不难看出,orderby更改了我们之前偏移的依据,原本我们是依据年月向前偏移的,orderby将其更改为参照销售数量。
blanks我们暂时忽略,那么partitionby是用来做什么的呢?
别急,我们添加如下代码查看:
Partitionby用法 =
CALCULATE ([Quantity],OFFSET (-1,ALL ( 'Date'[Year], 'Date'[YearMonth] ),,,PARTITIONBY ( 'Date'[Year] ))
)
结果如下:
partitionby的用途是为了进行分区,基本定义与SQL中是一致的,我们添加了年份字段进行分区,因为分区隔离的原因,向前偏移无法取到值,因此201801返回结果为空。
相关文章:

BI技巧丨利用OFFSET计算同环比
微软最近更新了很多开窗函数,其内部参数对比以往的DAX函数来说,多了很多,这就导致学习的时间成本直线上升。 而且对于新增函数的应用场景,很多小伙伴也是一知半解的,本期我们就来聊一聊关于最近新增的开窗函数——OFF…...

整理mongodb文档:collation
文章连接 整理mongodb文档:collation 看前提示 对于mongodb的collation。个人主要用的范围是在createcollection,以及find的时候用,所以本片介绍的时候也是这两个地方入手,对新手个人觉得理解概念就好。不要求强制性掌握,但是要…...
【LangChain】Prompts之Prompt templates
Prompts 编程模型的新方法是通过提示(prompts)。 prompts是指模型的输入。该输入通常由多个组件构成。 LangChain 提供了多个类和函数,使构建和使用prompts变得容易。 Prompt templates(提示模板): 参数化模型输入Example selectors(选择器示例): 动态选择要包含在…...
【数字IC基础】时序违例的修复
时序违例的修复 建立时间违例保持时间违例Buffer 插入位置参考资料 建立时间违例 基本思路是减少数据线的延时、减少 Launch clock line 的延时、增加capture clock line的delay 加强约束,重新进行综合,对违规的路径进行进一步的优化,但是一…...

深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测
大家好,我是微学AI,今天给大家介绍一下深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测。随着遥感技术和卫星图像获取能力的快速发展,卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一领域的研究进展,EuroSAT数据集应运而生。本文将详细…...
Node.js-fs模块文件创建、删除、重命名、文件内容的写入、读取以及文件夹的相关操作
一、写入文件操作 异步写入:writeFile() 同步写入:writeFileSync() const fs require("fs"); fs.writeFile("目标文件路径", "要写入的内容", err > {if(err){console.log(err);return;}console.log("写入成功&a…...

LIN协议总结
目录 一、LIN是什么1、LIN的概念2、扩展介绍一下同步通信和异步通信的区别3、LIN连接结构及节点构成 二、LIN的特点三、LIN协议层1、帧的结构2、帧的类型3、进度表4、状态机实现5、网络管理6、状态管理 四、帧收发的硬件实现1、组成2、硬件特点3、协议控制器4、总线收发器5、LI…...

Redis BigKey案例
面试题: 阿里广告平台,海量数据里查询某一固定前缀的key小红书,你如何生产上限制keys*/flushdb/flushall等危险命令以防止误删误用?美团,MEMORY USAGE命令你用过吗?BigKey问题,多大算big&#…...

ThinkPHP v6.0.8 CacheStore 反序列化漏洞
漏洞说明 1. 漏洞原理:ThinkPHP 6.0.8 CacheStore 会触发POP利用链子,造成任意命令执行 2. 组件描述: ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架 3. 影响版本:V6.0.8 漏洞复现 1. 环境安…...

Spring 事务详解(注解方式)
目 录 序言 1、编程式事务 2、配置声明式事务 2.1 基于TransactionProxyFactoryBean的方式(不常用,因为要为每一个类配置TransactionProxyFactoryBean) 2.2 基于AspectJ的XML方式(常用,可配置在某些类下的所有子…...
华为云waf 使用场景
防护Web应用免受攻击就用华为云Web应用防火墙 Web应用防火墙(Web Application Firewall, WAF),通过对HTTP(S)请求进行检测,识别并阻断SQL注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包含、敏感文件访问、第…...
?.的写法 后缀修饰符
概览:处理后端返回的数据data,写法:data?.name。解决vue框架编译出现的报错Cannot read property name of undefined。出现问题的原因:这是因为我们试图访问对象中不在的 key 为 name 的属性,那么怎么解决呢ÿ…...

org.apache.hadoop.hive.ql.exec.DDLTask. show Locks LockManager not specified解决
Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. show Locks LockManager not specified解决 当在Hive中执行show locks语句时,出现"LockManager not specified"错误通常是由于…...

Adaptive autosar 都有哪些模块?各有什么功能?
Adaptive autosar是一种用于高性能计算ECU的软件平台,它支持自适应应用程序的开发和运行。它由两部分组成:基础(Foundation)和服务(Service)。基础包括了操作系统接口、执行管理、网络管理、识别访问管理、加密、更新和配置管理等功能。服务包括了通信管理、RESTful、时间…...

C++ 动态内存分配
在C中动态内存的分配技术可以保证程序在允许过程中按照实际需要申请适量的内存,使用结束后还可以释放,这种在程序运行过程中申请和释放的存储单元也称为堆。 申请和释放过程一般称为建立和删除。 在C程序中,建立和删除堆对象使用两个运算符&…...
设计模式——面向对象的7大设计原则
1.单一职责原则 一个类中最好只放一种类型的方法,比如Dao中只有和数据库交互相关的代码。实现高内聚,低耦合。 2.开闭原则 对外拓展开放,对内修改关闭,有新的需求时不要修改已有代码,而是添加新的代码,比…...

智慧防汛,数字科技的力量
随着夏日的脚步临近,台风季节即将降临。对于那些居住在沿海地区的人们来说,台风是一种常见的自然灾害,其带来的风雨可能对生命和财产造成严重威胁。然而,随着数字科技的飞速发展,可视化技术为防汛抗台工作带来了全新的…...

“中国软件杯”飞桨赛道晋级决赛现场名单公布
“中国软件杯”大学生软件设计大赛是由国家工业和信息化部、教育部、江苏省人民政府共同主办,是全国软件行业规格最高、最具影响力的国家级一类赛事,为《全国普通高校竞赛排行榜》榜单内赛事。今年,组委会联合百度飞桨共同设立了“智能系统设…...

JDBC处理批量数据提高效率
文章目录 0 说明1 如何使用jdbc操作数据库1.1 加载数据库驱动1.2 建立数据库连接1.3 创建Statement或者PreparedStatement用来执行SQL1.4 开始执行SQL语句1.5 处理结果集1.6 关闭连接1.7 完整代码 2 批量操作数据库3 如何打印SQL语句4 jdbc常用开源类库 1 JDBC实现往MySQL插入百…...

使用css和js给按钮添加微交互的几种方式
使用css和js给按钮添加微交互的几种方式 在现实世界中,当我们轻弹或按下某些东西时,它们会发出咔嗒声,例如电灯开关。有些东西会亮起或发出蜂鸣声,这些响应都是“微交互”,让我们知道我们何时成功完成了某件事。在本文…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...