166_技巧_Power BI 窗口函数处理连续发生业务问题
166_技巧_Power BI 窗口函数处理连续发生业务问题
一、背景
在生产经营的数据监控中,会有一类指标需要监控是否连续发生,从而根据其在设定区间中的连续频次来评价业务。
例如:
- 员工连续迟到天数。
- 销售金额连续上升或者下降。
- 用户连续登陆天数。
- 找出设定区间符合销售金额连续增长产品明细,诸如此类…
在前面的文章其实已经对此类问题做了相应的演示(https://jiaopengzi.com/392.html)。
本次我们使用 Power BI 在 2022 年 12 月份更新的窗口函数来处理:找出设定区间符合销售金额连续增长产品明细 的问题。关于窗口函数的信息可以参考 Jeffrey Wang 在博客(https://pbidax.wordpress.com/2022/12/15/introducing-dax-window-functions-part-1/) 中的说明,已经非常的详细。本文我们将不花篇幅去讲解窗口函数了。我们重点来讲讲通过 DAX 去解决业务问题。
按照惯例还是先来看看结果
Power BI 公共 web 效果:https://demo.jiaopengzi.com/pbi/166-full.html

二、数据源及业务问题
首先感谢网友 @俊 提供数据,文中已经对数据进行了脱敏。
1、数据源
数据源非常简单,就一个销售数据表,其中包含日期、产品ID、销售金额

2、关系
建模必备的日期表,同时把 产品ID 单独拎出来做维度表,建立表间关系。

三、DAX
1、销售金额
基础度量没有什么好说的。
0000_销售金额 = SUM ( '销售数据'[销售金额] )
2、是否符合要求
0001是否符合要求 =
VAR ROW_MAX = /*当前事实表行数。*/COUNTROWS ( '销售数据' )
VAR T1 =/*准备好窗口函数需要的表格。*/SUMMARIZE ( ALLSELECTED ( '销售数据' ), '销售数据'[产品ID], 'A00_Calendar'[C01_Dates], '销售数据'[销售金额] )
VAR T2 =/* 1、根据产品ID和日期提前做好排序。2、需要注意这里使用的是绝对应用,之所以使用 N,是因为不会有比 N 更大的行数。3、因为要对每个 SKU 单独排序所以要使用 PARTITIONBY。*/WINDOW (1,ABS,ROW_MAX,ABS,T1,ORDERBY ( '销售数据'[产品ID], ASC, 'A00_Calendar'[C01_Dates], ASC ),KEEP,PARTITIONBY ( '销售数据'[产品ID] ))
VAR T3 =/*使用 OFFSET 偏移一行,实现错位,拿到 N+1 的数据。*/ADDCOLUMNS (T2,"@N+1",CALCULATE ([0000_销售金额],T1,OFFSET (1,T2,ORDERBY ( '销售数据'[产品ID], ASC, 'A00_Calendar'[C01_Dates], ASC ),KEEP,PARTITIONBY ( '销售数据'[产品ID] ))))
VAR T4 =/*错位后,N+1 大于成交金额金额即为满足增加。*/ADDCOLUMNS ( T3, "@是否递增", IF ( [@N+1] > [销售金额], 1, 0 ) )
VAR T5 =/*1、计算每个 SKU 记录数量 @count。2、计算每个 SKU 总共与多少是符合递增的。*/SUMMARIZE (T1,[产品ID],"@count", VAR SKU = [产品ID] VAR T = FILTER ( T1, [产品ID] = SKU ) RETURN COUNTROWS ( T ),"@growth", VAR SKU = [产品ID] VAR T = FILTER ( T4, [产品ID] = SKU ) RETURN SUMX ( T, [@是否递增] ))
VAR T6 =/*1、依据业务的要求,需要满足记录数大于5,则 @count > 52、满足连续递增曾则表示表示 SKU 记录数量 @count 和 满足递增爽 @growth 差 1 即可,第一期是没有计算的递增的。*/FILTER ( T5, [@count] - 1 = [@growth] && [@count] > 5 )
VAR TF =/*最有是要找出这些 SKU 那么输出表,在不建立计算表的情况下吗,那么就把使用度量值的设置是否等于1来实现筛选即可*/IF ( VALUES ( '产品表'[产品ID] ) IN SELECTCOLUMNS ( T6, "产品ID", [产品ID] ), 1, 0 )
RETURN/*符合要求度量值结果为 1 ,不符合要求度量值结果为 0*/TF
在上图 166-1 中,我们可以看到业务需求如下:找出成交金额随着日期连续大于5期递增的产品ID;找出产品ID后,计算出最小粒度日期环比(说明数据源的的产片销售日期不一定连续)
注意这里的度量值是否符合要求,我们是放到了切片器的视觉对象筛选器中,切片器的字段是产品ID。这里利用了度量值是否等于1的结果来判断是否符合要求。
我们通过切片器切换可以看到都是符合要求产品ID,表格所在区间都是符合连续递增的。

环比上期
环比上期度量值中我们可以看到,这个是一个日期维度的比较,我们并没有用到时间智能函数,同时注意结果中的日期都是不连续的。如果使用时间智能函数其实相对还比较麻烦。所以窗口函数在 DAX 中是一把利刃。
0002_环比上期 =
VAR FZ = [0000_销售金额]
VAR T0 =SUMMARIZE ( ALLSELECTED ( '销售数据' ), '产品表'[产品ID], 'A00_Calendar'[C01_Dates] )
VAR FM =CALCULATE ([0000_销售金额],OFFSET ( -1, T0, ORDERBY ( 'A00_Calendar'[C01_Dates], ASC ) ))
VAR _PERCENT =DIVIDE ( FZ - FM, FM )
VAR RESULT =IF ( HASONEFILTER ( A00_Calendar[C01_Dates] ), _PERCENT, BLANK () )
RETURNRESULT
四、关于连续发生事件的分步解析。

在 DAX Studio 中使用如下 DAX 代码去分布理解,其实也就是上述 “是否符合要求” 的度量值中的核心部分。
在结合注释理解连续发生问题的处理过程。就是把这类连续发生问题,首先通过排序来抽象成 1 或者 0,当然也可以抽象成 YES 或者 NO, 抽象为 1 和 0 在 DAX 计算中会更加方便。
其实这里面最主要的问题是在 DAX 中生成的过程表要能排序是非常困难的,当然也可以结合前面的文章来看(https://jiaopengzi.com/392.html),现在有了窗口函数也就更加得心应手了。
DEFINE
VAR ROW_MAX = /*当前事实表行数。*/COUNTROWS ( '销售数据' )
VAR T1 =/*准备好窗口函数需要的表格。*/SUMMARIZE ( ALLSELECTED ( '销售数据' ), '销售数据'[产品ID], 'A00_Calendar'[C01_Dates], '销售数据'[销售金额] )
VAR T2 =/* 1、根据产品ID和日期提前做好排序。2、需要注意这里使用的是绝对应用,之所以使用 N,是因为不会有比 N 更大的行数。3、因为要对每个 SKU 单独排序所以要使用 PARTITIONBY。*/WINDOW (1,ABS,ROW_MAX,ABS,T1,ORDERBY ( '销售数据'[产品ID], ASC, 'A00_Calendar'[C01_Dates], ASC ),KEEP,PARTITIONBY ( '销售数据'[产品ID] ))
VAR T3 =/*使用 OFFSET 偏移一行,实现错位,拿到 N+1 的数据。*/ADDCOLUMNS (T2,"@N+1",CALCULATE ([0000_销售金额],T1,OFFSET (1,T2,ORDERBY ( '销售数据'[产品ID], ASC, 'A00_Calendar'[C01_Dates], ASC ),KEEP,PARTITIONBY ( '销售数据'[产品ID] ))))
VAR T4 =/*错位后,N+1 大于成交金额金额即为满足增加。*/ADDCOLUMNS ( T3, "@是否递增", IF ( [@N+1] > [销售金额], 1, 0 ) )
VAR T5 =/*1、计算每个 SKU 记录数量 @count。2、计算每个 SKU 总共与多少是符合递增的。*/SUMMARIZE (T1,[产品ID],"@count", VAR SKU = [产品ID] VAR T = FILTER ( T1, [产品ID] = SKU ) RETURN COUNTROWS ( T ),"@growth", VAR SKU = [产品ID] VAR T = FILTER ( T4, [产品ID] = SKU ) RETURN SUMX ( T, [@是否递增] ))
VAR T6 =/*1、依据业务的要求,需要满足记录数大于5,则 @count > 52、满足连续递增曾则表示表示 SKU 记录数量 @count 和 满足递增爽 @growth 差 1 即可,第一期是没有计算的递增的。*/FILTER ( T5, [@count] - 1 = [@growth] && [@count] > 5 )
EVALUATE
T1
EVALUATE
T2
EVALUATE
T3
EVALUATE
T4
EVALUATE
T5
EVALUATE
T6
五、总结
1、本文使用 DAX 窗口函数处理连续发生问题的排序,也可以在 pq 中去处理,也能在 sql 一步到位。方式和工具还是比较多;一切工具都是为了业务服务的。
2、窗口函数在不连续的日期对比或者非日期的对比中都能实现, 极大的增加 Power BI 了数据的灵活性。
3、本文案例中,我们需求的是整个数据表为监控的区间,大家要能做到举一反三,如果需要监控不同日期区间或者不同产品ID区间只需要在在第一步中构造这样区间的上下文即可,在外部赋予它即可。
附件下载
https://jiaopengzi.com/2902.html
视频课
https://jiaopengzi.com/all-course
by 焦棚子
相关文章:
166_技巧_Power BI 窗口函数处理连续发生业务问题
166_技巧_Power BI 窗口函数处理连续发生业务问题 一、背景 在生产经营的数据监控中,会有一类指标需要监控是否连续发生,从而根据其在设定区间中的连续频次来评价业务。 例如: 员工连续迟到天数。销售金额连续上升或者下降。用户连续登陆…...
电子科技大学人工智能期末复习笔记(五):机器学习
目录 前言 监督学习 vs 无监督学习 回归 vs 分类 Regression vs Classification 训练集 vs 测试集 vs 验证集 泛化和过拟合 Generalization & Overfitting 线性分类器 Linear Classifiers 激活函数 - 概率决策 ⚠线性回归 决策树 Decision Trees 决策树构建递归…...
使用DDD指导业务设计的总结思考
领域驱动设计(DDD) 是 Eric Evans 提出的一种软件设计方法和思想,主要解决业务系统的设计和建模。DDD 有大量难以理解的概念,尤其是翻译的原因,某些词汇非常生涩,例如:模型、限界上下文、聚合、…...
面试官问:如何确保缓存和数据库的一致性?
如果你对这个问题有过研究,应该可以发现这个问题其实很好回答,如果第一次听到或者第一次遇到这个问题,估计会有点懵,今天我们来聊聊这个话题。 1、问题分析 首先我们来看看为什么会有这个问题! 我们在日常开发中&am…...
16.数据库Redis
一、基本概念 Redis(Remote Dictionary Server)译为“远程字典服务”,它是一款基于内存实现的键值型 NoSQL 数据库, 通常也被称为数据结构服务器,这是因为它可以存储多种数据类型,比如 string(字…...
【Redis高级-集群分片】
单机安装Redis首先需要安装Redis所需要的依赖:yum install -y gcc tclRedis安装包上传到虚拟机的任意目录:我放到了/tmp目录:解压缩:tar -zxvf /tmp/redis-6.2.4.tar.gz -C /tmp解压后:进入redis目录:cd /t…...
CSDN - CSDN27题解
文章目录幸运数字题目描述解题思路AC代码投篮题目描述解题思路AC代码通货膨胀-x国货币题目描述解题思路AC代码最后一位题目描述解题思路AC代码CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/41 这次题目描述刚开始好像有些问题,之后被修正了…...
docker拉取mysql
搜索mysql版本docker search mysql搜索获赞数(星星数量) 大于 1000 的镜像docker search --filterstars1000 mysql搜索官方发布的版本docker search --filter is-officialtrue mysql搜索版本号docker search mysql57拉取docker pull devbeta/mysql57查看下载镜像docker images启…...
在Linux上安装Python3
记录:373场景:在CentOS 7.9操作系统上,安装Python-3.8.9环境。版本:JDK 1.8 Python-3.8.9官网地址:https://www.python.org下载地址:https://www.python.org/ftp/python/1.安装基础依赖1.1安装gcc(1)安装命…...
23 种设计模式的通俗解释,看完秒懂
01 工厂方法 追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的 Factory 工厂模式&…...
如何做好需求管理?经验方法、模型、工具
需求管理能力是衡量产品经理能力的一个重要指标。因为需求是产品的基石,只有选取恰当的方法进行需求分析及管理,才能更好的构建产品方案,从而输出精准的产品定义。结合本人学习和自身经验,打算将需求管理分”需求挖掘”、”需求分…...
怎么用期货做风险对冲(如何利用期货对冲风险)
不同期货市场的同一期货品种的对冲交易怎么做 不同 期货市场 的同一期货品种的 对冲交易 。 因为地域和 制度环境 不同,同一种期货品种在不同市场的同一时间的价格很可能是不一样的,并且也是在不断变化的。 这样在一个市场做多头买进࿰…...
C++标准模板库type_traits源码剖析
一、type_traits源码介绍 1、type_traits是C11提供的模板元基础库。 2、type_traits可实现在编译期计算。包括添加修饰、萃取、判断查询、类型推导等等功能。 3、type_traits提供了编译期的true和false。 二、type_traits的作用 1、根据不同类型,模板匹配不同版本…...
Python获取公众号(pc客户端)数据,使用Fiddler抓包工具
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 今天来教大家如何使用Fiddler抓包工具,获取公众号(PC客户端)的数据。 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,…...
Maven进阶
这里写目录标题1.分模块开发1.1 模块更新后,会造成的影响2.依赖管理2.1 依赖传递2.2 可选依赖(隐藏自己的依赖,不让别人用)2.3 排除依赖(用别人的资源,把不用的去了)3.聚合与继承3.1 为什么要使用聚合工程?3.2 聚合工程开发2.1 聚合工程三级目录1.分模块开发 我们之前做的项目…...
AXI实战(一)-为AXI总线搭建简单的仿真测试环境
AXI实战(一)-搭建简单仿真环境 看完在本文后,你将可能拥有: 一个可以仿真AXI/AXI_Lite总线的完美主端(Master)或从端(Slave)一个使用SystemVerilog仿真模块的船信体验小何的AXI实战系列开更了,以下是初定的大纲安排: 欢迎感兴趣的朋友关注并支持,以下为正文部分 文章目录…...
数据库管理-第五十六期 监控(20230210)
数据库管理 2023-02-10第五十六期 监控1 怎么监控2 直观3 历史分析4 另一个BUG总结第五十六期 监控 春节后的7天班过后就来到了2月份,本周对之前发现X8M上的那个bug进行补丁修复和协助从12.2迁移了一套PDB到这个一体机上面,2次割接。这周还和原厂老大哥…...
测试开发,测试架构师为什么能拿50 60k呢需要掌握哪些技能呢
这篇文章是软件工程系列知识总结的第五篇,同样我会以自己的理解来阐述软件工程中关于架构设计相关的知识。相比于我们常见的研发架构师,测试架构师是近几年才出现的一个岗位,当然岗位title其实没有特殊的含义,在我看来测试架构师其…...
Miniblink 入门
miniblink官网:入门之前强烈建议将Miniblink介绍仔细看一遍。 MB内核组件标准版接口文档:这里列举了所有的api以及简单的说明,但是本人建议还是看wke.h更方便,里面都是宏实现的,直接搜相关函数即可。 mb demo下载和参…...
[python入门㊷] - python存储数据
目录 ❤ json.dump()存储数据 ❤ json.laod()读取数据 ❤ 保存和读取用户生成的数据 ❤ 重构 JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用 ❤ json.dump()存储数据…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
