Power BI中计算每个用户对应第二小日期min2_date的实现方法
Power BI 计算用户第二小日期解决方案
你可以选择以下两种方案实现需求,均完全符合你提出的规则要求:
方案1:DAX 计算列实现(适合建模阶段使用)
直接在数据表中新建计算列,粘贴以下代码即可,注意替换代码中的你的表名为实际表名:
min2_date = VAR current_user = '你的表名'[user_id] VAR user_all_dates = FILTER('你的表名', '你的表名'[user_id] = current_user) VAR date_ranked = ADDCOLUMNS( user_all_dates, "rnk", RANKX(user_all_dates, '你的表名'[date],,ASC,Dense) ) VAR second_min_date = CALCULATE(VALUES('你的表名'[date]), FILTER(date_ranked, [rnk] = 2)) RETURN // 若无第二小日期返回-1,有则返回对应日期,统一转文本格式兼容-1输出 IF(ISBLANK(second_min_date), "-1", FORMAT(second_min_date, "yyyy-mm-dd"))
规则适配说明:
- 使用Dense稠密排序,相同日期会获得相同排名,第二小日期和第一小日期相同时会直接返回该日期,符合规则2
- 若用户只有1条日期数据,不存在排名为2的记录时返回-1,符合规则1
方案2:Power Query(M语言)实现(适合数据清洗阶段使用)
在Power Query编辑器中操作,步骤如下:
- 选中对应数据表,点击「转换」选项卡→「分组依据」,选择高级分组:
- 分组列选择
user_id - 新列名输入
date_list,操作选择「所有行」,点击确定
- 分组列选择
- 点击「添加列」→「自定义列」,输入以下M代码:
let sorted_dates = List.Sort(Table.Column([date_list], "date")), get_second = try sorted_dates{1} otherwise -1 in get_second
- 将新列命名为
min2_date,再展开date_list列中你需要保留的其他业务字段即可
规则适配说明:
- 日期排序后直接取索引为1的元素(列表索引从0开始,对应第二个元素),存在重复最小日期时直接取到相同值,符合规则2
- 若用户日期列表长度不足2,取值报错后会捕获异常返回-1,符合规则1
内容的提问来源于stack exchange,提问作者WhoIsKi
相关产品推荐
相关产品推荐

