如何编写DAX函数获取满足21天未出现后首次触发Intrusion的camera_id列表
用DAX实现符合要求的摄像头ID分组列表
先标记符合条件的首次入侵记录
给数据表添加一个计算列,用来标记每条Intrusion记录是否为该摄像头**第一次满足“前21天未出现过入侵”**的条目:
IsQualifiedFirstIntrusion = VAR 当前摄像头 = 'Table'[camera_id] VAR 当前日期 = 'Table'[date] // 提取该摄像头所有更早的入侵记录日期 VAR 更早的入侵日期 = CALCULATETABLE( VALUES('Table'[date]), ALLEXCEPT('Table', 'Table'[camera_id]), 'Table'[action] = "Intrusion", 'Table'[date] < 当前日期 ) // 获取最近的一次更早入侵日期 VAR 上一次入侵日期 = MAXX(更早的入侵日期, [date]) // 判断当前记录是否有效:要么是首次入侵,要么与上一次入侵间隔超过21天 VAR 是否有效 = IF( 'Table'[action] = "Intrusion" && (ISBLANK(上一次入侵日期) || 当前日期 - 上一次入侵日期 > 21), TRUE(), FALSE() ) // 找到该摄像头第一条有效记录的日期 VAR 第一个有效日期 = CALCULATE( MIN('Table'[date]), ALLEXCEPT('Table', 'Table'[camera_id]), 是否有效 = TRUE() ) // 仅当当前日期为第一条有效日期时,标记为符合条件 RETURN IF(当前日期 = 第一个有效日期, TRUE(), FALSE())
按日期分组生成摄像头ID列表
创建计算表,自动按日期分组汇总当天符合条件的摄像头ID:
合格摄像头按日期分组 = SUMMARIZECOLUMNS( 'Table'[date], FILTER('Table', 'Table'[IsQualifiedFirstIntrusion] = TRUE()), "符合条件的摄像头ID", CONCATENATEX(VALUES('Table'[camera_id]), [camera_id], ", ") )
如果是在报表可视化场景中使用,也可以编写度量值,在矩阵/表格中展示每个日期对应的摄像头列表:
度量值_合格摄像头列表 = VAR 当前日期 = MAX('Table'[date]) VAR 合格摄像头 = CALCULATETABLE( VALUES('Table'[camera_id]), 'Table'[date] = 当前日期, 'Table'[IsQualifiedFirstIntrusion] = TRUE() ) RETURN CONCATENATEX(合格摄像头, [camera_id], ", ")
逻辑说明
- 计算列先对每条入侵记录做有效性判断:要么是该摄像头首次触发入侵,要么与上一次入侵的间隔超过21天。
- 从中筛选出每个摄像头的第一条有效记录,确保是首次满足条件的出现。
- 最后按日期分组,将当天的合格摄像头ID汇总成列表。
内容的提问来源于stack exchange,提问作者chloebui
相关产品推荐
相关产品推荐

