Dax动态计算最后连续缺勤天数
问题的提出
人事部门的同事可能会接触到一项基础的统计工作,就是看截至当前日期下,每个员工的连续缺勤天数。
示例数据如图,1表示当天未出勤,辅助列是姓名和日期连接:
常规思路(模拟)
实现思路先用Excel表格中模拟如下:
首先按每个人每天的出勤日期倒序
然后对每个员工的未出勤标志从最大日期开始往下进行累乘运算。如果开头是未出勤的1,往下面累乘最后会因为遇到0变成0,每个员工可以算出来累乘结果为1的天数,就是最大连续缺勤天数了,如图所示:
如上图所示,每个员工累积那列有几个1,就表示该员工从最大日期开始连续几天缺勤,如张三”累积“列有3个1,合起来就是连续缺勤3天。
在Dax中实现
可以看到刚才模拟的方法中,核心是求累积(按照固定顺序的累积),按顺序求累积需要有上下行之间的计算(这点在Excel中很容易做到)。但是Dax的数据特点是列式计算,没有上下行的概念,一般是借助排序后加索引的方式实现(关于索引,Power Query排序后添加的索引列有时候会不稳定,本文采用的是动态创建索引的方法)。
先把数据放到模型中
为了方便演示,这里我们先把数据上传到Power Pivot模型中,然后再使用Dax Studio连接调试(连接步骤参考链接),进行操作演示。
下面为连接成功界面
由于我们的考勤表里没有索引,我们首先来添加索引列,使用的是SUBSTITUTEWITHINDEX函数
EVALUATE
// 构建一个主表,待加入索引列
VAR FactTable = SELECTCOLUMNS('表1' , "Item" , '表1'[辅助列],"日期",'表1'[考勤日期],
"姓名",'表1'[姓名],"打标",'表1'[未出勤])// 构建一个参考表
VAR FactWithIndexs = ADDCOLUMNS(FactTable , "Index" , [Item] )
Var MasterTable=DISTINCT(SELECTCOLUMNS(FactTable,"Index",[Item]))// 为主表建立一个索引列替换主表中在参考表出现的列,并按参考表的列排序
Var NewTable=SUBSTITUTEWITHINDEX( FactWithIndexs , "Index" , MasterTable , [Index] , DESC )
return NewTable
order by [Index]
有了Index以后,计算就可以借助PRODUCTX来计算每个员工的未出勤标志的累积了
EVALUATE
// 构建一个主表,待加入索引列
VAR FactTable = SELECTCOLUMNS('表1' , "Item" , '表1'[辅助列],"日期",'表1'[考勤日期],
"姓名",'表1'[姓名],"打标",'表1'[未出勤])// 构建一个参考表
VAR FactWithIndexs = ADDCOLUMNS(FactTable , "Index" , [Item] )
Var MasterTable=DISTINCT(SELECTCOLUMNS(FactTable,"Index",[Item]))// 为主表建立一个索引列替换主表中在参考表出现的列,并按参考表的列排序
Var NewTable=SUBSTITUTEWITHINDEX( FactWithIndexs , "Index" , MasterTable , [Index] , DESC )Var ProductTable=ADDCOLUMNS(NewTable,"累积",Var s=[姓名] Var t=[Index]
Return PRODUCTX(FILTER(NewTable,AND([姓名]=s,[Index]<=t)),[打标]))
return ProductTable
order by [Index]
有了累积,接下来就变得非常简单,只需要把每个员工的累积列求和汇总,就知道连续缺勤天数。
在透视表中使用的话,我们每个员工作为筛选行,实际上我们应该按日期倒序排序得到索引即可,于是我们创建度量值如下:
连续缺勤天数:=
VAR FactTable = SELECTCOLUMNS(CALCULATETABLE( '表1' ,ALL('表1'[考勤日期])), "Item" , '表1'[考勤日期],"日期",'表1'[考勤日期],
"姓名",'表1'[姓名],"打标",'表1'[未出勤])// 构建一个参考表
VAR FactWithIndexs = ADDCOLUMNS(FactTable , "Index" , [Item] )
Var MasterTable=DISTINCT(SELECTCOLUMNS(FactTable,"Index",[Item]))// 为主表建立一个索引列替换主表中在参考表出现的列,并按参考表的列排序
Var NewTable=SUBSTITUTEWITHINDEX( FactWithIndexs , "Index" , MasterTable , [Index] , DESC )Var ProductTable=ADDCOLUMNS(NewTable,"累积",Var s=[姓名] Var t=[Index]
Return PRODUCTX(FILTER(NewTable,AND([姓名]=s,[Index]<=t)),[打标]))
RETURN SUMX(ProductTable,[累积])
在模型中新建度量值,拷贝上面代码
在模型中新建一个透视,拖入度量值可正常计算缺勤天数
进阶解法
通过微信群与大佬交流,针对上述问题,感谢群友“黑魔导”提供了一种崭新的思路,直接上代码
最后连续缺勤天数:=
SUMX(VALUES('表1'[姓名]),
Var a=CALCULATE(MAX('表1'[考勤日期]))
Var b=CALCULATE(MAX('表1'[考勤日期]),'表1'[未出勤]=0)
return
IF(b=BLANK(),COUNTROWS(VALUES('表1'[考勤日期])),a-b))
相比于常规的做Index求累积的做法,该进阶方法十分简洁高效,解释一下代码的逻辑
SUMX()+VALUES()组合用于迭代每一个员工
变量a求当前员工的最大考勤记录日期
变量b求当前员工出勤的最大考勤记录日期
此时有2种情况,三种分支:
1、如果某员工最大考勤日期那天出勤,那么a=b,则计算出a-b=0,则该员工最新连续缺勤天数为0
2、如果某员工最大考勤日期那天未出勤,
①b存在的情况下(该员工至少有1天出勤)则计算a-b=n,即为最新连续缺勤天数
②b不存在的情况下(该员工没有一天出勤)则计算该员工的考勤记录天数即为最新连续缺勤天数
Dax动态计算最后连续缺勤天数相关推荐
- SQL计算QQ连续登陆天数
最近遇到一个SQL查询需求:计算QQ连续登陆天数? 连续登陆天数不间断,如果有一天没登陆就重新计算. 数据准备 mysql> create table user_login(user_id in ...
- 124_Power PivotPower BI DAX优化计算最大连续次数
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最大连续次数或者是最大连续子序列问题,在DAX中如何快速计算呢? 思路 1.N-1:按照INDEX错位 2.ST ...
- Python应用实战-Pandas 计算连续行为天数的几种思路
最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数. 这里用北京空气质量数据作为案例进行演示,需求是找出北京空气质量连续污染最长持续多久并确定其周期. 图1:案例数据 以上图中数据来算,可 ...
- HiveSQL面试题18--腾讯面试用户连续签到天数及历史最大连续签到天数问题
目录 0 题目 1 数据准备 3 数据分析 4 小结 0 题目 有一张用户签到表[t_user_attendence],标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字 ...
- sql server计算日期到当前日期天数_Excel如何统计连续停机天数问题
前几天有个朋友问了一个关于连续时间统计的问题,使用Power Query for Excel来解决的.今天在张俊红老师的公众号上看到了使用使用SQL来解决连续时间的统计问题.这个问题是一个非常经典的例 ...
- mysql 连续天数_mysql计算连续天数,mysql连续登录天数,连续天数统计
mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...
- mysql 连续签到天数_新版签到活动明天上线,福利活动抢鲜看~
明天游戏中心app旧版福利签到活动马上就要结束啦,虽然很多的魅友反馈说积分签到结束的太早,积分不够换5折券,不过更早的开启新版签到才能更快的享受到更好的福利嘛~ 今晚0点新版签到活动即将上线,接下来就 ...
- PowerBI/DAX的计算组功能是什么?怎么用?
目录 一.前言 二.计算组与SELECTEDMEASURE 2.1 同比数据的度量值实现 2.2 同比数据的计算组实现一 2.2.1 计算组功能在哪里? 2.2.2 采用计算组快速得到同比数据 2.3 ...
- power bi 日期计算_PowerBI 动态计算周内日权重指数
在很多行业,尤其是零售业,其销售规律在一周内呈现一定的特点. 例如:平时有一种购买特点:周末有一种购买特点. 故而一周内的星期一到星期日呈现一定的权重分布. 周内日权重分布 1 到 12 表示月序号: ...
最新文章
- .net 连接ORACLE 数据库的例子
- 开源大数据平台的安全实践
- Qt文档阅读笔记-Qt Quick Controls - Wearable Demo实例解析
- 掌握 Ajax,第 11 部分: 服务器端的 JSON
- js实现表格的行删除和增加_vue小demo之实现表格的增加和删除
- VB获取windows各常用目录的函数(模块)
- python 阮一峰_Python模块整理
- Kotlin基础学习第5章—表达式
- Git基本操作(学习笔记)
- 计算机网络基础 (一) —— 概念、组成、功能、分类
- 好家伙,花了一个月时间写了个网易云,以后再也不用充VIP了!
- 北京农村商业银行:应用质量掘金再造“探秘”之旅
- python from. import失败_彻底搞懂Python 中的 import 与 from import
- flask中的可拨插视图
- 世界公认的健康水果大排名!第一名居然是……
- 【SRAM】CubeMX配置STM32H743+IS61WV204816外部扩展SRAM
- EXCEL清除全表格式
- Bombs CodeForces - 350C
- C#中在鼠标经过Button控件时显示提示信息(弹出气泡提示框)
- 心阶ssr上不去_高中数学成绩上不去的“九宗罪”!附经典数学题50道