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()存储数据…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...