EARLIER
返回所述列的外部计算传递中指定列的当前值。
对于要将某个值用作输入并基于该输入生成计算的嵌套计算而言,EARLIER 非常有用。 在 Microsoft Excel 中,只能在当前行的上下文内执行此类计算;但是,在 DAX 中,可以存储输入的值,然后使用整个表中的数据进行计算。
EARLIER 主要用于计算的列的上下文。
语法
EARLIER(<column>, <number>)
parameters
术语 | 定义 |
---|---|
列 | 解析为列的列或表达式。 |
num | (可选)外部计算传递的正数。 下一个外部计算级别由 1 表示;两个外部级别由 2 表示,依此类推。 省略时,默认值为 1。 |
返回值
外部计算传递的数字所在列的当前行值。
异常
错误说明
备注
如果在表扫描开始之前存在行上下文,EARLIER 则成功。 否则它将返回错误。
EARLIER 的执行速度可能比较缓慢,因为从理论上讲,它可能需要执行大量操作,操作次数接近于总行数(列中)乘以相同数字(具体因表达式的语法而异)。 例如,如果列中有 10 行,则可能需要大约 100 次操作;如果有 100 行,则可能会执行接近 10,000 次操作。
在已计算的列或行级安全性 (RLS) 规则中使用时,不支持在 DirectQuery 模式下使用此函数。
注意
实际上,VertiPaq 内存中分析引擎会执行优化以减少实际的计算数量,但在创建涉及递归的公式时应谨慎使用。
示例
为了说明 EARLIER 的用法,需要构建一个方案来计算排名值,然后在其他计算中使用此排名值。
下面的示例基于此简单的表 ProductSubcategory,显示了每个 ProductSubcategory 的总销售额。
此处显示包含排名列的最终表。
ProductSubcategoryKey | EnglishProductSubcategoryName | TotalSubcategorySales | SubcategoryRanking |
---|---|---|---|
18 | 骑行背带短裤 | 156,167.88 美元 | 18 |
26 | 自行车车架 | $220,720.70 | 14 |
27 | 单车存放架 | $35,628.69 | 30 |
28 | 瓶子和笼子 | $59,342.43 | 24 |
5 | 底托架 | $48,643.47 | 27 |
6 | 刹车装置 | $62,113.16 | 23 |
19 | 上限 | $47,934.54 | 28 |
7 | Chains | $8,847.08 | 35 |
29 | 清洁剂 | $16,882.62 | 32 |
8 | 牙盘 | $191,522.09 | 15 |
9 | 换挡装置 | $64,965.33 | 22 |
30 | 挡泥板 | $41,974.10 | 29 |
10 | 前叉 | $74,727.66 | 21 |
20 | 手套 | $228,353.58 | 12 |
4 | 把手 | $163,257.06 | 17 |
11 | 耳机 | $57,659.99 | 25 |
31 | 头盔 | $451,192.31 | 9 |
32 | 水袋背包 | $96,893.78 | 20 |
21 | 运动衫 | $699,429.78 | 7 |
33 | 光 | 36 | |
34 | 锁 | $15,059.47 | 33 |
1 | 山地自行车 | $34,305,864.29 | 2 |
12 | 山地自行车车架 | $4,511,170.68 | 4 |
35 | 挂包 | 36 | |
13 | 脚踏板 | $140,422.20 | 19 |
36 | 打气筒 | $12,695.18 | 34 |
2 | 公路自行车 | $40,551,696.34 | 1 |
14 | 公路自行车车架 | $3,636,398.71 | 5 |
15 | 鞍座 | $52,526.47 | 26 |
22 | 短裤 | $385,707.80 | 10 |
23 | 袜子 | $28,337.85 | 31 |
24 | 紧身衣 | $189,179.37 | 16 |
37 | 轮胎和内胎 | $224,832.81 | 13 |
3 | 观光自行车 | $13,334,864.18 | 3 |
16 | 观光自行车车架 | $1,545,344.02 | 6 |
25 | 背心 | $240,990.04 | 11 |
17 | 车轮 | $648,240.04 | 8 |
创建排名值
获取行中给定值的排名值的一种方法是在同一表中对行数值大于(或小于)所比较的行进行计数。 此方法针对表中的最大值返回空白或零值,而相等的值将有相同的排名值,并且下一个值(在相等的值之后)将具有非连续的排名值。 请看以下示例。
使用以下公式创建了一个新的计算列 SubCategorySalesRanking。
= COUNTROWS(FILTER(ProductSubcategory, EARLIER(ProductSubcategory[TotalSubcategorySales])<ProductSubcategory[TotalSubcategorySales]))+1
以下步骤更详细地介绍了计算方法。
EARLIER 函数获取表中当前行的 TotalSubcategorySales 值。 在此情况下,由于进程正在启动,所以获取的是表中的第一行
EARLIER([TotalSubcategorySales]) 的计算结果是 $156,167.88,即外部循环中的当前行。
FILTER 函数现在返回一个表,其中所有行所具有的 TotalSubcategorySales 值均大于 $156,167.88(这是 EARLIER 的当前值)。
COUNTROWS 函数对已筛选表的行进行计数,并将此值分配到当前行中新的计算列,并且加 1。 需要加 1 来防止顶部排名值变为空白。
接着计算列公式会移到下一行,并重复步骤 1 到 4。 这些步骤将一直重复,直至到达表的末尾。
EARLIER 函数将始终在当前表操作之前获取列值。 如果需要在此之前获取循环中的值,请将第二个参数设为 2。