Power BI中按患者分组获取手术次数、首次及末次手术方法
按患者分组统计手术信息的DAX解决方案
需求说明
处理手术数据库,每行包含患者ID、手术日期、手术类型及记录ID,需按患者分组统计以下信息:
- 手术次数
- 首次手术类型
- 末次手术类型
现有DAX已通过GROUPBY统计手术次数,需补充首次、末次手术类型的获取逻辑。
原始数据示例
| patient | date | surgery | id |
|---|---|---|---|
| A | 01-01-22 | Eyes | 1 |
| B | 01-01-22 | Mouth | 2 |
| C | 01-01-22 | Nose | 3 |
| A | 01-05-22 | Mouth | 4 |
| C | 01-06-22 | Eyes | 5 |
| B | 01-07-22 | Mouth | 6 |
| A | 01-12-22 | Nose | 7 |
期望输出
| patient | number of surgeries | First Surgery | Last Surgery |
|---|---|---|---|
| A | 3 | Eyes | Nose |
| B | 2 | Mouth | Mouth |
| C | 2 | Nose | Eyes |
当前DAX代码
N_Surgery = GROUPBY(Surgery, Surgery[patient_id], "N_Surgery", COUNTX(CURRENTGROUP(), Surgery[id]))
参考R实现代码
Summarise <- DF%>% group_by(patient_id)%>% summarise(N_Surgery = n(), First = surgery[which.min(date)], Last = surgery[which.max(date)])
DAX解决方案
方法1:扩展现有GROUPBY逻辑
在原GROUPBY中添加计算首次、末次手术的逻辑,通过CURRENTGROUP()获取当前患者的所有记录,先找到最小/最大手术日期,再匹配对应的手术类型:
Patient_Surgery_Summary = GROUPBY( Surgery, Surgery[patient_id], "Number of Surgeries", COUNTX(CURRENTGROUP(), Surgery[id]), "First Surgery", VAR MinDate = MINX(CURRENTGROUP(), Surgery[date]) RETURN MAXX(FILTER(CURRENTGROUP(), Surgery[date] = MinDate), Surgery[surgery]), "Last Surgery", VAR MaxDate = MAXX(CURRENTGROUP(), Surgery[date]) RETURN MAXX(FILTER(CURRENTGROUP(), Surgery[date] = MaxDate), Surgery[surgery]) )
方法2:使用SUMMARIZE函数(更简洁)
SUMMARIZE是DAX中更常用的分组聚合函数,逻辑更直观,无需依赖CURRENTGROUP():
Patient_Surgery_Summary = SUMMARIZE( Surgery, Surgery[patient_id], "Number of Surgeries", COUNT(Surgery[id]), "First Surgery", VAR MinDate = MIN(Surgery[date]) RETURN CALCULATE(VALUES(Surgery[surgery]), Surgery[date] = MinDate), "Last Surgery", VAR MaxDate = MAX(Surgery[date]) RETURN CALCULATE(VALUES(Surgery[surgery]), Surgery[date] = MaxDate) )
注意事项
如果同一患者在同一天有多个不同手术,VALUES()会返回多个结果,此时可根据需求用CONCATENATEX合并多个手术类型,例如:
RETURN CONCATENATEX(CALCULATETABLE(Surgery, Surgery[date] = MinDate), Surgery[surgery], ", ")
内容的提问来源于stack exchange,提问作者Edjotace
相关产品推荐
相关产品推荐

