在 power BI 中,我有一个名为“Job Catalogue”的表,其中包含以下数据:
职位编号 | 姓名 | 类型 | 频率 |
---|---|---|---|
1 | 备份 | 每日 | 2 |
2 | 报告 | 每周 | 3 |
3 | 评论 | 每月 | 15 |
频率代表以下内容:
如果“每日”,则为一天中执行任务的次数。
如果“每周”,是执行任务的星期几。
如果“每月”,是执行任务的月份中的某一天。
我还有一个使用下一个 DAX 公式动态创建的“日期”表: 日期 = 日历(开始日期,结束日期)
因此,如果我创建从 1 月 1 日到 1 月 2 日(2024 年)的“日期”表,则预期运行应该是:
职位编号 | 日期 |
---|---|
1 | 2024-01-01 |
1 | 2024-01-01 |
1 | 2024-01-02 |
1 | 2024-01-02 |
2 | 2024-01-02 |
作业 ID 1,每天出现 2 次。
作业 ID 2,出现 1 次,因为 1 月 2 日是一周的第 3 天。
作业 ID 3,不会出现,因为“日期”表中没有第 15 天,但如果该日期存在,则应该存在。
使用 DAX,如何创建“预期运行”表?
我无法使用“CROSSJOIN”,因为“日期”和“职位目录”之间没有关系。
我们可以使用
GENERATE
来补充每日跑步的水分,并使用 CROSSJOIN
(或 GENERATE
)来帮助进行每周和每月的跑步,然后根据需要进行过滤。
Expected Runs =
var tblDaily =
CROSSJOIN(
SELECTCOLUMNS(
GENERATE(
FILTER( 'Job Catalogue', [Type] = "Daily" ),
GENERATESERIES( 1, [Frequency] )
),
"Job ID", [Job ID]
),
ALL(Dates[Date])
)
var tblWeeklyMonthly =
SELECTCOLUMNS(
FILTER(
CROSSJOIN( ALL(Dates[Date]), FILTER( 'Job Catalogue', [Type] <> "Daily" ) ),
( [Type] = "Weekly" && WEEKDAY([Date], 1) = [Frequency] ) ||
( [Type] = "Monthly" && DAY([Date]) = [Frequency] )
),
"Job ID", [Job ID],
"Date", [Date]
)
return UNION( tblDaily, tblWeeklyMonthly )