计算模型

Power Query M 公式语言的计算模型是根据电子表格中常见的计算模型建模的,这种模型可以基于单元格中公式之间的依赖关系来确定计算顺序。

如果你已经在 Excel 等电子表格中编写过公式,你可能会意识到左侧的公式在计算时会生成右侧的值:

Evaluation Model 1

Evaluation Model 2

在 M 中,表达式可以按名称引用以前的表达式,并且计算过程会自动确定所引用表达式的计算顺序。

我们将使用一个记录来生成一个与上述电子表格示例等效的表达式。 初始化字段的值时,请按字段名称引用记录中的其他字段,如下所示:

[
    A1 = A2 * 2,
    A2 = A3 + 1,
    A3 = 1
]

上面的表达式计算为以下记录:

[
    A1 = 4,
    A2 = 2,
    A3 = 1
]

记录可以包含在其他记录中,也可以嵌套在其他记录中。 你可以使用“查找运算符” ([]) 按名称访问记录的字段。 例如,以下记录具有一个名为 Sales 的字段(包含一个记录)和一个名为 Total 的字段(用于访问 Sales 记录的 FirstHalf 和 SecondHalf 字段):

[
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
    Total = Sales[FirstHalf] + Sales[SecondHalf]
]

上面的表达式计算为以下记录:

[
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
    Total = 2100
]

你可以使用“位置索引运算符” ({ }) 按其数字索引访问列表中的项目。 从列表的开头开始,使用从零开始的索引来引用列表中的值。 例如,索引 0 和 1 用于引用下面列表中的第一和第二项:

[
    Sales =
        {
            [
                Year = 2007,
                FirstHalf = 1000,
                SecondHalf = 1100,
                Total = FirstHalf + SecondHalf // equals 2100
            ],
            [
                Year = 2008,
                FirstHalf = 1200,
                SecondHalf = 1300,
                Total = FirstHalf + SecondHalf // equals 2500
            ]
        },
    #"Total Sales" = Sales{0}[Total] + Sales{1}[Total] // equals 4600
]

延迟计算和迫切计算

“列表”、“记录”和“表”成员表达式以及 let 表达式(请转到表达式、值和 let 表达式)使用“延迟计算”进行计算。 也就是说,在需要时进行计算。 所有其他表达式都使用迫切计算进行计算。 也就是说,在计算过程中遇到它们时,会立即进行计算。 考虑这一点的一种好方法是记住评估列表或记录表达式将返回一个列表或记录值,该值知道在请求时(查找或索引运算符)需如何计算其列表项或记录字段。