如何使用DAX按周一至周日的周维度计算每周Quantity最大值
需求说明
现有一张存储多年业务数据的表,包含Quantity、Date、Time三个字段,需要基于Date列按自然周(周一为周起始、周日为周结束)统计每周的Quantity最大值。
示例数据如下,其中2022-06-07(周一)至2022-06-12(周日)所在周的最大Quantity值为12:
| Quantity | Date | Time |
|---|---|---|
| 1 | 2022-06-07 | 04:39:57.090 |
| 2 | 2022-06-07 | 04:39:58.850 |
| 3 | 2022-06-08 | 04:37:35.900 |
| 4 | 2022-06-08 | 04:37:37.247 |
| 5 | 2022-06-09 | 04:37:56.833 |
| 6 | 2022-06-09 | 04:37:58.190 |
| 7 | 2022-06-10 | 04:37:34.757 |
| 8 | 2022-06-10 | 04:37:36.103 |
| 9 | 2022-06-11 | 04:38:18.733 |
| 10 | 2022-06-11 | 04:38:20.100 |
| 11 | 2022-06-12 | 04:38:30.377 |
| 12 | 2022-06-12 | 04:38:31.833 |
| 13 | 2022-06-13 | 04:38:30.377 |
| 14 | 2022-06-14 | 04:38:31.833 |
问题原因
原有DAX代码的筛选逻辑仅保留了表中最大日期对应的行,没有按周划定日期范围,因此无法实现按周统计最大值的需求,原错误代码如下:
CALCULATE( MAX( 'stock_xml'[Quantity] ), FILTER( 'stock_xml', 'stock_xml'[Date] = MAX( 'stock_xml'[Date] ) ) ) RETURN Stock
修正方案
核心逻辑是先按「周一为周起始」的规则,给每个日期匹配所属周的时间范围,再在周范围内计算Quantity的最大值,根据使用场景分两种实现方式:
方式1:添加计算列(适合直接在表里固定周维度统计值)
首先新增一列计算每行数据所属周的周一日期,作为周分组的唯一标识:Week Start = VAR current_date = 'stock_xml'[Date] // WEEKDAY第二参数传2时,周一返回1、周日返回7,完全匹配周起始规则 VAR weekday_offset = WEEKDAY(current_date, 2) RETURN current_date - weekday_offset + 1再新增一列,按周分组计算每组的最大Quantity:
Weekly Max Quantity = CALCULATE( MAX('stock_xml'[Quantity]), ALLEXCEPT('stock_xml', 'stock_xml'[Week Start]) )方式2:编写度量值(适合在可视化报表中配合日期维度动态统计)
直接在度量值中动态识别当前上下文所属周的日期范围,计算范围内最大值:Weekly Max Quantity = VAR min_date_in_context = MIN('stock_xml'[Date]) VAR week_start = min_date_in_context - WEEKDAY(min_date_in_context, 2) + 1 VAR week_end = week_start + 6 RETURN CALCULATE( MAX('stock_xml'[Quantity]), DATESBETWEEN('stock_xml'[Date], week_start, week_end) )
关键注意点:
WEEKDAY函数的第二参数必须传2,才能保证周一为一周的第一天,不需要额外做日期偏移修正。
内容的提问来源于stack exchange,提问作者Balaganesh
相关产品推荐
相关产品推荐

