如何用DAX创建基于油井月度生产数据的两类索引计算列
基于日期和油井的DAX计算列实现:RunningActMonth与RunningMonth
需求回顾
针对多油井的月度生产数据,需为每个油井生成两个计算列:
- RunningActMonth:找到首个有产量(原油/水/天然气任一数值>0)的月份后,仅在当月有产量时递增计数,无产量时保持之前的最大计数;首个产量月份前返回0。
- RunningMonth:找到首个有产量的月份后,无论当月是否有产量,持续递增计数;首个产量月份前返回0。
实现步骤
1. 辅助列:判断当月是否有产量
先创建辅助列标记当月是否存在有效产量,简化后续计算:
HasProduction = IF(OR('Table'[原油(Oil)]>0, 'Table'[水(Water)]>0, 'Table'[天然气(Gas)]>0), 1, 0)
2. 计算列:RunningActMonth
RunningActMonth = VAR WellFilter = ALLEXCEPT('Table', 'Table'[油井(Well)]) VAR FirstProdDate = CALCULATE(MIN('Table'[日期]), WellFilter, 'Table'[HasProduction] = 1) VAR CurrentDate = 'Table'[日期] VAR ProdCount = CALCULATE(COUNTROWS('Table'), WellFilter, 'Table'[日期] <= CurrentDate, 'Table'[HasProduction] = 1) RETURN IF(CurrentDate < FirstProdDate, 0, ProdCount)
逻辑说明:
WellFilter:限定计算仅针对当前行的油井FirstProdDate:找到当前油井第一个有产量的日期ProdCount:统计当前日期及之前,该油井有产量的月份总数- 最终判断:若当前日期早于首个产量日期返回0,否则返回统计的产量月份数
3. 计算列:RunningMonth
RunningMonth = VAR WellFilter = ALLEXCEPT('Table', 'Table'[油井(Well)]) VAR FirstProdDate = CALCULATE(MIN('Table'[日期]), WellFilter, 'Table'[HasProduction] = 1) VAR CurrentDate = 'Table'[日期] VAR MonthDiff = DATEDIFF(FirstProdDate, CurrentDate, MONTH) + 1 RETURN IF(CurrentDate < FirstProdDate, 0, MonthDiff)
逻辑说明:
- 同样限定油井上下文并找到首个产量日期
MonthDiff:计算当前日期与首个产量日期的月份间隔,加1得到连续递增的计数- 最终判断:早于首个产量日期返回0,否则返回间隔计数
验证示例
以示例中的PP-0001油井为例:
- 首个产量日期为1990-09,该日期前所有行的两个计算列均返回0
- 1990-09至1991-05期间每月均有产量,RunningActMonth从1递增至9,RunningMonth同步递增至9
- 1991-06至1991-09无产量,RunningActMonth保持9,RunningMonth继续递增至13
- 1991-10恢复产量,RunningActMonth递增至10,RunningMonth递增至14,与示例结果完全匹配
内容的提问来源于stack exchange,提问作者Marcelo Saez
相关产品推荐
相关产品推荐

