Power Query自定义列按分组统计首月非零原油产量计数方法求助
Power Query 实现步骤与公式
核心逻辑
先按「PRMS Reserves Category、PRMS Reserves Sub Category、UNIQUEID」三个维度定位每个井的首次非零产量月份,再统计每个分组月度下匹配首次投产月的井数,其余月份计数为0。
分步实现(推荐,易维护、性能更优)
步骤1:提取所有井的首次非零产量月份表
对原始表(此处命名为源)先筛选非零产量记录,再分组取每个井的最小日期:
首次投产月映射 = Table.Group( Table.SelectRows(源, each [Gross Oil Well Head Volume (MBBL)] > 0), {"PRMS Reserves Category", "PRMS Reserves Sub Category", "UNIQUEID"}, {{"首次投产月", each List.Min([Date]), type date}} )
步骤2:生成月度产量聚合表
按分组+月份维度聚合总产量:
月度产量聚合 = Table.Group( 源, {"PRMS Reserves Category", "PRMS Reserves Sub Category", "Date"}, {{"Sum of Gross Oil", each List.Sum([Gross Oil Well Head Volume (MBBL)]), type number}} )
步骤3:添加Count自定义列
关联首次投产月映射表,统计当前月份符合条件的井数:
结果表 = Table.AddColumn(月度产量聚合, "Count", (current) => Table.RowCount( Table.SelectRows(首次投产月映射, each [PRMS Reserves Category] = current[PRMS Reserves Category] and [PRMS Reserves Sub Category] = current[PRMS Reserves Sub Category] and [首次投产月] = current[Date] ) ), type number )
单自定义列嵌套写法(适合不想拆分中间表的场景)
直接在月度聚合表中添加如下公式的自定义列即可,无需单独生成中间映射表:
(current) => let // 筛选当前分组下所有非零产量记录 filterGroup = Table.SelectRows(源, each [PRMS Reserves Category] = current[PRMS Reserves Category] and [PRMS Reserves Sub Category] = current[PRMS Reserves Sub Category] and [Gross Oil Well Head Volume (MBBL)] > 0 ), // 统计当前分组下每个井的首次投产月 firstProdMonth = Table.Group(filterGroup, {"UNIQUEID"}, {{"首次月", each List.Min([Date])}}), // 匹配当前月份的井数 count = Table.RowCount(Table.SelectRows(firstProdMonth, each [首次月] = current[Date])) in count
注意事项
- 需确保
Date列为日期类型,若为文本格式需先转换为日期,否则最小日期计算会出错 - 数据量超过10万行时推荐用分步写法,提前对分组列、日期列建索引可大幅提升查询效率
内容的提问来源于stack exchange,提问作者Jeff Stewart
相关产品推荐
相关产品推荐

