如何在Power BI中用DAX创建预期运行时间表(不可用CROSSJOIN)
用DAX创建「Expected Runs」表(无表关系且禁用CROSSJOIN)
需求回顾
现有两张无关联的表:
- 「Job Catalogue」任务清单表:
| Job ID | Name | Type | Frequency |
|---|---|---|---|
| 1 | Backup | Daily | 2 |
| 2 | Report | Weekly | 3 |
| 3 | Review | Monthly | 15 |
Frequency字段规则:
- Daily:每日执行次数
- Weekly:每周执行的星期几(示例中以周日为一周第1天,2024-01-02周二对应第3天)
- Monthly:每月执行的日期
- 「Dates」动态日期表:由
Dates = CALENDAR(StartDate, EndDate)生成,日期范围可动态调整
需生成符合预期的「Expected Runs」表,且禁止使用CROSSJOIN函数。
DAX实现代码
Expected Runs = -- 处理每日任务:按频率生成对应次数的行 VAR DailyJobs = GENERATE( FILTER('Job Catalogue', 'Job Catalogue'[Type] = "Daily"), GENERATE( 'Dates', GENERATESERIES(1, 'Job Catalogue'[Frequency], 1) ) ) -- 处理每周任务:匹配对应星期几的日期 VAR WeeklyJobs = GENERATE( FILTER('Job Catalogue', 'Job Catalogue'[Type] = "Weekly"), FILTER( 'Dates', WEEKDAY('Dates'[Date], 1) = 'Job Catalogue'[Frequency] ) ) -- 处理每月任务:匹配对应日期的日历日 VAR MonthlyJobs = GENERATE( FILTER('Job Catalogue', 'Job Catalogue'[Type] = "Monthly"), FILTER( 'Dates', DAY('Dates'[Date]) = 'Job Catalogue'[Frequency] ) ) -- 合并三类任务结果,统一输出列 RETURN UNION( SELECTCOLUMNS(DailyJobs, "Job ID", 'Job Catalogue'[Job ID], "Date", 'Dates'[Date]), SELECTCOLUMNS(WeeklyJobs, "Job ID", 'Job Catalogue'[Job ID], "Date", 'Dates'[Date]), SELECTCOLUMNS(MonthlyJobs, "Job ID", 'Job Catalogue'[Job ID], "Date", 'Dates'[Date]) )
代码逻辑说明
DailyJobs:
- 先筛选出所有每日任务,再与Dates表生成全量日期组合
- 通过
GENERATESERIES根据Frequency值生成对应次数的行,实现同一日期重复Frequency次的效果
WeeklyJobs:
- 筛选出每周任务,匹配Dates表中星期几与Frequency一致的日期
WEEKDAY(Date, 1)表示周日为一周第1天,若你的业务规则是周一为第1天,可将参数改为2
MonthlyJobs:
- 筛选出每月任务,匹配Dates表中日历日与Frequency一致的日期
结果合并:
- 用
SELECTCOLUMNS统一三类任务的输出列名,再通过UNION合并成最终表
- 用
验证示例结果
当Dates表范围为2024-01-01至2024-01-02时:
- Job 1(Daily,Frequency=2):每个日期生成2行,共4行
- Job 2(Weekly,Frequency=3):2024-01-02是周二(WEEKDAY值为3),生成1行
- Job 3(Monthly,Frequency=15):日期范围内无15号,无输出行
完全符合预期结果。
内容的提问来源于stack exchange,提问作者Eärandir
相关产品推荐
相关产品推荐

