基于DAX度量值筛选符合连续日期特定事件条件的表
DAX度量值实现特定条件筛选需求
需求概述
针对每个唯一的UserID,需筛选满足以下全部条件的行:
- 用户的首日活动(最早日期的Activity)为Run
- 首日之后存在连续多天的Run记录
- 在连续Run记录之后,出现非Run的Activity且Hobby为Garden
- 保留该用户从首日连续Run开始,直到首次出现符合要求的非Run+Garden记录的所有行
示例数据表格
| Date | UserID | Activity | Hobby |
|---|---|---|---|
| 2020/01/05 | 01A | Run | Stamps |
| 2020/01/06 | 01A | Run | Stamps |
| 2020/01/07 | 01A | Walk | Garden |
| 2020/01/05 | 02B | Run | Stamps |
| 2020/01/06 | 02B | Run | Stamps |
| 2020/01/07 | 02B | Run | Garden |
| 2020/01/08 | 02B | Run | Garden |
| 2020/01/05 | 03C | Run | Stamps |
| 2020/01/06 | 03C | Run | Stamps |
| 2020/01/07 | 03C | Walk | Garden |
| 2020/01/08 | 03C | Walk | Garden |
| 2020/01/05 | 04A | Run | Stamps |
| 2020/01/06 | 04B | Run | Stamps |
| 2020/01/05 | 04A | Run | Garden |
| 2020/01/08 | 04B | Run | Garden |
| 2022/01/08 | 04B | Run | Garden |
筛选规则说明
- 01A的前3行保留:用户连续2天Run,后续出现Walk且Hobby为Garden,符合全部条件
- 02B的4行全部排除:始终是Run活动,未出现非Run的Activity,不满足条件
- 03C仅前3行保留:第4天的Walk之前没有连续Run记录(前一天已经是Walk),因此该行排除
- 04A、04B的5行全部排除:活动日期不连续,且未出现符合要求的非Run+Garden后续记录
DAX度量值实现
核心筛选度量值
Keep Row = VAR CurrentUser = 'Table'[UserID] VAR CurrentDate = 'Table'[Date] -- 获取用户最早活动日期 VAR UserFirstDate = CALCULATE(MIN('Table'[Date]), ALLEXCEPT('Table', 'Table'[UserID])) -- 验证首日活动是否为Run VAR FirstActivityIsRun = CALCULATE(MAX('Table'[Activity]), ALLEXCEPT('Table', 'Table'[UserID]), 'Table'[Date] = UserFirstDate) = "Run" IF(NOT(FirstActivityIsRun), 0, -- 查找首次出现非Run且Hobby为Garden的日期 VAR TargetDate = CALCULATE(MIN('Table'[Date]), ALLEXCEPT('Table', 'Table'[UserID]), 'Table'[Activity] <> "Run", 'Table'[Hobby] = "Garden") IF(ISBLANK(TargetDate), 0, -- 检查从首日到TargetDate的所有日期中,除TargetDate外均为Run VAR DatesUpToTarget = FILTER(VALUES('Table'[Date]), 'Table'[Date] <= TargetDate) VAR ConsecutiveRunValid = COUNTROWS( FILTER(DatesUpToTarget, CALCULATE(MAX('Table'[Activity]), ALLEXCEPT('Table', 'Table'[UserID]), 'Table'[Date] = [Date]) = "Run" || [Date] = TargetDate ) ) = COUNTROWS(DatesUpToTarget) -- 满足条件则标记为保留 IF(ConsecutiveRunValid && CurrentDate <= TargetDate, 1, 0) ) )
应用方式
在表格或可视化组件中添加筛选条件:Keep Row = 1,即可得到符合要求的行。
度量值逻辑说明
- 先校验用户首日活动是否为Run,不满足直接排除所有相关行
- 定位该用户首次出现非Run且Hobby为Garden的日期,若无此日期则排除所有行
- 验证从首日到目标日期的区间内,除目标日期外所有记录的Activity均为Run,确保连续Run的完整性
- 最终标记符合区间要求且连续Run有效的行
内容的提问来源于stack exchange,提问作者Aleister Tanek Javas Mraz
相关产品推荐
相关产品推荐

