基于HHID和Date的多列数值增长检测技术问询
需求:基于HHID和Date维度,检测是否存在两列及以上的数值增长(即同一HHID下,至少2个Question的Points从最早日期到最晚日期出现增长)。
现有操作思路:
- 复制源文件两份,分别通过排序及
Table.Buffer提取最小日期、最大日期的去重数据 - 合并后得到对应日期的Points值,计划进一步对比各Question的Points变化,统计增长列数:≥2标记为
true,≤1标记为false
已知当前方案存在冗余,这是目前能想到的起始思路。已用颜色标记数据变化:增长(绿)、下降(红)、无变化(橙),数据集示例如下:
HHID Date Question Points
1 3/21/2022 Attendance 3
1 3/21/2022 Childcare 3
1 3/21/2022 Education 2
1 3/21/2022 Employment 2
1 3/21/2022 Family Development/Parent Engagement 2
1 3/21/2022 Family Safety 3
1 3/21/2022 Financial Management 3
1 3/21/2022 Food Security 3
1 3/21/2022 Housing 5
1 3/21/2022 Income 3
1 3/21/2022 Language Skills 0
1 3/21/2022 Literacy Grades 1 - 3 3
1 3/21/2022 Physical and Mental Health 1
1 3/21/2022 Substance Use 2
1 3/21/2022 Transportation 5
1 6/13/2024 Attendance 4
1 6/13/2024 Childcare 2
1 6/13/2024 Education 1
1 6/13/2024 Employment 4
1 6/13/2024 Family Development/Parent Engagement 4
1 6/13/2024 Family Safety 4
1 6/13/2024 Financial Management 4
1 6/13/2024 Food Security 3
1 6/13/2024 Housing 3
1 6/13/2024 Income 3
1 6/13/2024 Language Skills 5
1 6/13/2024 Literacy Grades 1 - 3 5
1 6/13/2024 Physical and Mental Health 5
1 6/13/2024 Substance Use 4
1 6/13/2024 Transportation 4
无需复制两份源文件,通过分组+透视的方式即可高效完成统计,步骤如下:
- 按HHID分组,提取每个HHID的最早和最晚日期数据
- 透视Question列,将同一Question的首尾日期Points值转为横向对比
- 标记每个Question的增长情况,统计增长数量并生成最终判断结果
完整M代码:
let 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content], // 统一日期列类型,避免格式错误 调整日期类型 = Table.TransformColumnTypes(源,{{"Date", type date}}), // 按HHID分组,筛选出每个分组的最早和最晚日期数据 分组筛选首尾日期 = Table.Group(调整日期类型, {"HHID"}, { {"筛选后数据", each let 最早日期 = List.Min([Date]), 最晚日期 = List.Max([Date]) in Table.SelectRows(_, each [Date] = 最早日期 or [Date] = 最晚日期)}}), // 展开分组数据 展开数据 = Table.ExpandTableColumn(分组筛选首尾日期, "筛选后数据", {"Date", "Question", "Points"}, {"Date", "Question", "Points"}), // 透视日期列,得到每个Question的首尾Points值 透视日期列 = Table.Pivot(展开数据, List.Distinct(展开数据[Date]), "Date", "Points"), // 重命名列,明确区分首尾数值 重命名列 = Table.RenameColumns(透视日期列, { {List.Min(展开数据[Date]), "初始Points"}, {List.Max(展开数据[Date]), "最终Points"}}), // 标记增长情况:最终值>初始值则记为1,否则为0 添加增长标记 = Table.AddColumn(重命名列, "增长标记", each if [最终Points] > [初始Points] then 1 else 0), // 按HHID统计增长列数,生成最终判断结果 统计并判断 = Table.Group(添加增长标记, {"HHID"}, { {"增长列数", each List.Sum([增长标记])}, {"是否满足条件", each List.Sum([增长标记]) >= 2}}) in 统计并判断
- 先统一日期类型,避免因日期格式不一致导致的筛选错误
- 一次分组即可提取每个HHID的首尾日期数据,省去复制文件的冗余操作
- 透视操作将纵向的Question转为横向列,直观对比同一Question的首尾数值
- 用1/0标记增长状态,求和后直接得到增长列数,再判断是否达到≥2的要求
运行上述代码后,将得到每个HHID对应的增长列数和最终的true/false标记,比原方案更简洁高效。
内容的提问来源于stack exchange,提问作者Holly Szady

