You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI统计连续有值行及获取起始日期与最高等级问题求助

Power Query M代码修正:统计连续AE记录组

问题分析

你的代码核心问题在于提前过滤了空值行,导致无法识别原始数据中AE列空值造成的连续中断。比如record_id=10的hb_ae在12/9/2015的行是空,这行是连续组的中断点,但你过滤空值后,前后的有值行被当成了连续的,从而统计错误。

正确思路是保留所有原始行,先标记每个AEType是否有值,再基于原始排序判断连续组,最后过滤无值行进行统计。

修正后的代码

Source = table_name,

// 统一数据类型,确保AE列数值类型一致
ChangedTypes = Table.TransformColumnTypes(
    Source,
    {
        {"record_id", type text},
        {"visit_date", type date},
        {"int_date", type date},
        {"sched", type text},
        {"hb_ae", Int64.Type},
        {"wbc_ae", Int64.Type},
        {"anc_ae", Int64.Type},
        {"plt_ae", Int64.Type},
        {"ast_ae", Int64.Type},
        {"alt_ae", Int64.Type},
        {"arc_hb_ae", Int64.Type}
    }
),

// 逆透视AE列,保留所有行(包括空值)
UnpivotedAll = Table.Unpivot(
    ChangedTypes,
    {"hb_ae","wbc_ae","anc_ae","plt_ae","ast_ae","alt_ae","arc_hb_ae"},
    "AEType",
    "Grade"
),

// 按record_id、AEType、就诊日期排序,确保顺序正确
Sorted = Table.Sort(
    UnpivotedAll,
    {
        {"record_id", Order.Ascending},
        {"AEType", Order.Ascending},
        {"visit_date", Order.Ascending}
    }
),

// 分组标记连续组:判断当前行是否与上一行属于同一连续组
GroupedWithContinuation = Table.Group(
    Sorted,
    {"record_id", "AEType"},
    {
        {"GroupedRows", each 
            let
                // 添加行索引,用于获取上一行数据
                Indexed = Table.AddIndexColumn(_, "RowIndex", 0, 1),
                // 标记连续组起始行:当前行有值,且上一行无值/是第一行
                MarkStart = Table.AddColumn(Indexed, "IsGroupStart", each 
                    [Grade] <> null and (
                        [RowIndex] = 0 or 
                        Indexed[Grade]{[RowIndex]-1} = null
                    )
                ),
                // 生成连续组唯一标识:累计起始行数量
                AddGroupKey = Table.AddColumn(MarkStart, "GroupKey", each 
                    List.Count(List.Range(MarkStart[IsGroupStart], 0, [RowIndex]+1, 1))
                )
            in
                AddGroupKey
        }
    }
),

// 展开分组后的行数据
ExpandedGrouped = Table.ExpandTableColumn(
    GroupedWithContinuation,
    "GroupedRows",
    {"visit_date", "int_date", "sched", "Grade", "GroupKey"}
),

// 过滤掉无AE记录的空值行
FilteredValid = Table.SelectRows(ExpandedGrouped, each [Grade] <> null),

// 按连续组分组统计所需字段
FinalGrouped = Table.Group(
    FilteredValid,
    {"record_id", "AEType", "int_date", "sched", "GroupKey"},
    {
        {"AEDate", each List.Min([visit_date]), type date},
        {"AEs", each Table.RowCount(_), Int64.Type},
        {"MaxGrade", each List.Max([Grade]), Int64.Type}
    }
),

// 调整列顺序并排序
FinalResult = Table.ReorderColumns(
    FinalGrouped,
    {"record_id", "AEType", "int_date", "AEDate", "AEs", "MaxGrade", "sched"}
),
FinalSorted = Table.Sort(FinalResult, {{"record_id", Order.Ascending}, {"AEDate", Order.Ascending}})

in
FinalSorted

修正要点说明

  1. 保留全量数据:不再提前过滤空值,确保能捕捉到AE列空值导致的连续中断。
  2. 连续组标识生成:通过对比当前行与上一行的AE值存在状态,标记连续组起始点,再累计起始点数量生成唯一GroupKey,确保每个连续组独立区分。
  3. 类型统一处理:明确指定AE列的数值类型,避免排序、统计时出现类型错误。

内容的提问来源于stack exchange,提问作者mcadamsjustin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:22:01