Power Query基于多列生成自定义季度分组编号的技术需求
企业年度季度分组编号实现(Power Query M代码)
问题背景
现有企业年度水果产品销售数据表,数据按季度分类但无显式季度字段,需按以下规则生成季度分组编号:
- 以每个企业对应年度的最早Start日期作为该年度的第1季度起始
- 基于
Company、Year、推导后的Quarter生成分组编号,年度内最早季度编号为1,依次递增 - 若季度跨年度(如起始日期为2022/01/01),则归属到
Start日期对应的年度
你之前尝试的M代码无法得到预期结果:
= Table.Group(#"Sorted Rows2", {"Company","Year","Start"}, {{"Data", each Table.AddIndexColumn(_, "Index", 1, 1), type table}})
问题出在这段代码是按Start单独分组,每个分组都从1开始生成索引,而非按企业年度内的季度顺序统一编号。
正确实现步骤
1. 先按企业、年度、Start日期排序
首先对数据按Company、Year、Start升序排序,保证同一企业同一年度内的季度按时间先后排列:
#"Sorted Rows" = Table.Sort(#"Your Previous Step",{{"Company", Order.Ascending}, {"Year", Order.Ascending}, {"Start", Order.Ascending}})
替换#"Your Previous Step"为你实际的前置步骤名称。
2. 按企业+年度分组并生成全局季度编号
核心操作是在Company和Year的分组内,对每个唯一季度(即唯一Start)生成连续递增的编号:
#"Grouped with Quarter Number" = Table.Group(#"Sorted Rows", {"Company", "Year"}, { {"QuarterDetails", each Table.AddIndexColumn(Table.Distinct(_, {"Start"}), "QuarterNumber", 1, 1), type table} })
逻辑说明:
- 按
Company+Year分组,确保同一企业同一年度的数据聚合在一起 - 用
Table.Distinct(_, {"Start"})提取分组内所有唯一的季度起始日期 - 对这些唯一日期添加
QuarterNumber索引,从1开始递增,实现年度内最早季度为1,后续依次+1
3. 将编号关联回原数据表(可选)
如果需要把QuarterNumber匹配到原数据的每一行,执行以下步骤:
#"Expanded Quarter Details" = Table.ExpandTableColumn(#"Grouped with Quarter Number", "QuarterDetails", {"Start", "QuarterNumber"}, {"Start", "QuarterNumber"}), #"Merged with Original Data" = Table.NestedJoin(#"Your Original Data", {"Company", "Year", "Start"}, #"Expanded Quarter Details", {"Company", "Year", "Start"}, "QuarterInfo", JoinKind.LeftOuter), #"Expanded Quarter Info" = Table.ExpandTableColumn(#"Merged with Original Data", "QuarterInfo", {"QuarterNumber"}, {"QuarterNumber"})
替换#"Your Original Data"为排序前的原数据表步骤名称。
额外说明
- 若季度跨年度(比如某季度从2022/12/1开始),只要
Start字段是2022年的日期,就会归属到2022年度,完全符合需求 - 如果原表的
Year字段不是基于Start日期生成的,先添加正确的年度字段:#"Added Year" = Table.AddColumn(#"Previous Step", "Year", each Date.Year([Start]))
内容的提问来源于stack exchange,提问作者Smith Dwayne
相关产品推荐
相关产品推荐

