Power Query M函数中何处添加条件语句以避免索引溢出?
解决Power Query中检索最接近x的上方值的索引溢出问题
需求说明
从指定表格中检索最接近变量x的上方值:
- 若x小于列中部分值,返回大于等于x的最小值
- 若x大于列中所有值,返回列最大值
示例表格
| S | 1 | 2 | 3 |
|---|---|---|---|
| 0 | 1698 | 1737 | 1781 |
| 1 | 1737 | 1795 | 1855 |
| 2 | 1780 | 1854 | 1928 |
| 3 | 1822 | 1912 | 2002 |
| 4 | 1864 | 1971 | 2075 |
| 5 | 1907 | 2029 | 2149 |
| 6 | 1949 | 2086 | 2222 |
| 7 | 1992 | 2145 | 2296 |
| 8 | 2034 | 2203 | 2369 |
| 9 | 2077 | 2262 | 2443 |
| 10 | 2119 | 2320 | 2516 |
| 11 | 2162 | 2378 | 2590 |
问题描述
当变量S="1"、x=2000时,现有M函数代码可正确返回2034;但当x=2500时,触发**"枚举元素不足"的索引溢出错误**。尝试添加条件语句处理该情况时,代码出现**"Token Identifyer Expected"错误**,需解决条件语句的正确写法及位置。
现有正常场景代码
let S = "1", x = 2000, Source = tblSchalen, Result = Table.Column(Source, S){List.Count(List.Select( Table.Column(Source, S), each _ <= x))} in Result
尝试的错误代码
let S = "1", x = 2500, Source = tblSchalen, amount = List.Count(List.Select(Table.Column(Source, S), each _ <= x)), // this return a number from 0 - 12 if amount > 11 then amount = 11 else amount = amount Result = Table.Column(amount) in Result
解决方案
错误原因分析
- 原代码溢出问题:当x大于列中所有值时,
List.Count(List.Select(...))返回列的总行数(12),但列表索引从0开始,最大有效索引为11,因此索引12会触发溢出。 - 错误代码语法问题:Power Query的
let块中,赋值语句必须是变量名 = 表达式的格式,不能直接写if语句;且Table.Column的参数错误,应该传入表格和列名,而非数字。
正确代码写法1(修正索引逻辑)
let S = "1", x = 2500, Source = tblSchalen, TargetColumn = Table.Column(Source, S), MatchCount = List.Count(List.Select(TargetColumn, each _ <= x)), // 处理边界:如果所有元素都<=x,取最后一个元素的索引 TargetIndex = if MatchCount = List.Count(TargetColumn) then List.Count(TargetColumn) - 1 else MatchCount, Result = TargetColumn{TargetIndex} in Result
正确代码写法2(更直观的筛选逻辑)
这种写法直接贴合需求逻辑,避免索引操作的风险:
let S = "1", x = 2500, Source = tblSchalen, TargetColumn = Table.Column(Source, S), // 筛选所有>=x的元素 FilteredList = List.Select(TargetColumn, each _ >= x), // 筛选结果为空则取列最大值,否则取筛选结果的最小值 Result = if List.IsEmpty(FilteredList) then List.Max(TargetColumn) else List.Min(FilteredList) in Result
内容的提问来源于stack exchange,提问作者Sardientje
相关产品推荐
相关产品推荐

