问题的提出

人事部门的同事可能会接触到一项基础的统计工作,就是看截至当前日期下,每个员工的连续缺勤天数。

示例数据如图,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动态计算最后连续缺勤天数相关推荐

  1. SQL计算QQ连续登陆天数

    最近遇到一个SQL查询需求:计算QQ连续登陆天数? 连续登陆天数不间断,如果有一天没登陆就重新计算. 数据准备 mysql> create table user_login(user_id in ...

  2. 124_Power PivotPower BI DAX优化计算最大连续次数

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最大连续次数或者是最大连续子序列问题,在DAX中如何快速计算呢? 思路 1.N-1:按照INDEX错位 2.ST ...

  3. Python应用实战-Pandas 计算连续行为天数的几种思路

    最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数. 这里用北京空气质量数据作为案例进行演示,需求是找出北京空气质量连续污染最长持续多久并确定其周期. 图1:案例数据 以上图中数据来算,可 ...

  4. HiveSQL面试题18--腾讯面试用户连续签到天数及历史最大连续签到天数问题

    目录 0 题目 1 数据准备 3 数据分析 4 小结 0 题目 有一张用户签到表[t_user_attendence],标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字 ...

  5. sql server计算日期到当前日期天数_Excel如何统计连续停机天数问题

    前几天有个朋友问了一个关于连续时间统计的问题,使用Power Query for Excel来解决的.今天在张俊红老师的公众号上看到了使用使用SQL来解决连续时间的统计问题.这个问题是一个非常经典的例 ...

  6. mysql 连续天数_mysql计算连续天数,mysql连续登录天数,连续天数统计

    mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...

  7. mysql 连续签到天数_新版签到活动明天上线,福利活动抢鲜看~

    明天游戏中心app旧版福利签到活动马上就要结束啦,虽然很多的魅友反馈说积分签到结束的太早,积分不够换5折券,不过更早的开启新版签到才能更快的享受到更好的福利嘛~ 今晚0点新版签到活动即将上线,接下来就 ...

  8. PowerBI/DAX的计算组功能是什么?怎么用?

    目录 一.前言 二.计算组与SELECTEDMEASURE 2.1 同比数据的度量值实现 2.2 同比数据的计算组实现一 2.2.1 计算组功能在哪里? 2.2.2 采用计算组快速得到同比数据 2.3 ...

  9. power bi 日期计算_PowerBI 动态计算周内日权重指数

    在很多行业,尤其是零售业,其销售规律在一周内呈现一定的特点. 例如:平时有一种购买特点:周末有一种购买特点. 故而一周内的星期一到星期日呈现一定的权重分布. 周内日权重分布 1 到 12 表示月序号: ...

最新文章

  1. .net 连接ORACLE 数据库的例子
  2. 开源大数据平台的安全实践
  3. Qt文档阅读笔记-Qt Quick Controls - Wearable Demo实例解析
  4. 掌握 Ajax,第 11 部分: 服务器端的 JSON
  5. js实现表格的行删除和增加_vue小demo之实现表格的增加和删除
  6. VB获取windows各常用目录的函数(模块)
  7. python 阮一峰_Python模块整理
  8. Kotlin基础学习第5章—表达式
  9. Git基本操作(学习笔记)
  10. 计算机网络基础 (一) —— 概念、组成、功能、分类
  11. 好家伙,花了一个月时间写了个网易云,以后再也不用充VIP了!
  12. 北京农村商业银行:应用质量掘金再造“探秘”之旅
  13. python from. import失败_彻底搞懂Python 中的 import 与 from import
  14. flask中的可拨插视图
  15. 世界公认的健康水果大排名!第一名居然是……
  16. 【SRAM】CubeMX配置STM32H743+IS61WV204816外部扩展SRAM
  17. EXCEL清除全表格式
  18. Bombs CodeForces - 350C
  19. C#中在鼠标经过Button控件时显示提示信息(弹出气泡提示框)
  20. 心阶ssr上不去_高中数学成绩上不去的“九宗罪”!附经典数学题50道

热门文章

  1. 渗透(香港)劲舞团官方论坛
  2. 古筝d调变降e调怎么办_从d调调到e调,教你古筝的操作方法
  3. 使用Python检测服务器的某个端口是否成功打开
  4. Android Activity onPause/onResume切换演示
  5. C语言可变参数函数(printf/scanf)
  6. 通过电脑向 Iphone 的 WPS 中传递文档
  7. 服务器虚拟hub,什么是虚拟集线器HUB?
  8. java枚举 取值_秒懂系列,超详细Java枚举教程!!!
  9. markdown 合并单元格
  10. python学习笔记之三:字典,当索引不好用时