WINDOW

适用于:计算列计算表视觉计算

返回位于给定间隔内的多个行。

语法

WINDOW ( from[, from_type], to[, to_type][, <relation> or <axis>][, <orderBy>][, <blanks>][, <partitionBy>][, <matchBy>][, <reset>] )

parameters

术语 定义
from 指示窗口的开始位置。 它可以是返回标量值的任何 DAX 表达式。
行为取决于 from_type 参数:
- 如果 from_type 为 REL,则从当前行返回的行数(负值)或向前(正值)以获取窗口中的第一行。
- 如果 from_type 是 ABS,并且 from 为正数,则它是从分区开头窗口开始的位置。 索引基于 1,0 解释为 1。 例如,0 和 1 表示窗口从分区的开头开始。 如果 from 为负数,则表示窗口从分区末尾开始的位置。 -1 表示分区中的最后一行。
from_type 修改 from 参数的行为。 可能的值为 ABS(绝对)和 REL(相对)。 默认为 REL。
to from相同,但表示窗口的末尾。 最后一行包含在窗口中。
to_type from_type相同,但修改 to的行为。
relation (可选)从中返回输出行的表表达式。 如果在视觉计算中使用,此参数接受视觉形状中的轴。
如果指定,partitionBy 中的所有列都必须来自它或相关表。
如果省略:必须显式指定
- orderBy
- 所有 orderBypartitionBy 表达式都必须是完全限定的列名,并且来自单个表。
- 默认为 ALLSELECTED 和 orderBy中的所有列的 partitionBy()。
orderBy (可选)包含定义每个分区排序方式的表达式的 ORDERBY() 子句。
如果省略:必须显式指定
- relation
- 默认为 relation 中尚未在 partitionBy中指定的每一列排序。
blanks (可选)一个枚举,用于定义在对 relationaxis进行排序时如何处理空值。
支持的值为:
  • DEFAULT(默认值),其中数值的行为为空值,在零值和负值之间排序。 字符串的行为是空值在所有字符串(包括空字符串)之前排序。
  • FIRST,无论升序或降序排序顺序如何,空白始终在开头排序。
  • LAST,无论升序还是降序排序顺序,始终在末尾对空白进行排序。

注意,如果同时指定 blanks 函数中的 ORDERBY 参数和空值,则单个 orderBy 表达式上的 优先于相关 orderBy 表达式,而未指定 blanks orderBy 表达式将遵循父函数上的 blanks 参数。
partitionBy (可选)一个PARTITIONBY () 子句,其中包含定义分区方式relation的列。 如果省略,则 relation 被视为单个分区。
matchBy (可选)一个MATCHBY () 子句,其中包含定义如何匹配数据和标识当前行的列。
reset (可选)仅在视觉计算中可用。 指示计算是否重置,以及视觉形状的列层次结构的哪个级别。 接受的值包括:对当前视觉形状、NONE(默认值)、LOWESTPARENTHIGHESTPARENT或整数中的列的字段引用。 此行为取决于整数符号:
- 如果为零或省略,则计算不会重置。 等效于 NONE
- 如果为正值,则整数标识从最高、与粒度无关的列。 HIGHESTPARENT 等效于 1。
- 如果为负数,则整数标识从最低到当前粒度的列。 LOWESTPARENT 等效于 -1。

返回值

窗口中的所有行。

注解

除了由 DAX 表函数添加的列、relation中的每个列、matchBy 不存在时,或者 matchBypartitionBy中的每个列(如果存在 matchBy),必须具有相应的外部值,以帮助定义要对其操作的当前行。 如果 from_typeto_type 两者都具有值 ABS,则以下内容仅适用于 partitionBy 列:

  • 如果正好有一个对应的外部列,则使用其值。
  • 如果没有相应的外部列:
    • WINDOW 首先确定没有相应外部列的所有列。
    • 对于 WINDOW父上下文中这些列的现有值的每个组合,将计算 WINDOW,并返回相应的行。
    • WINDOW 最终输出是这些行的联合。
  • 如果有多个相应的外部列,则返回错误。

如果 relation 表函数添加了所有 DAX列,则返回错误。

如果存在 matchBy,WINDOW 将尝试使用 matchBypartitionBy 列来标识行。 如果 matchBy 不存在并且 orderBy 中指定的列和 partitionBy 无法唯一标识 relation中的每一行,则:

  • WINDOW 将尝试查找唯一标识每行所需的最少列数。
  • 如果找到此类列,WINDOW 将自动将这些新列追加到 orderBy,并且每个分区都使用此新的 orderBy 列集进行排序。
  • 如果找不到此类列,则返回错误。

如果:

  • orderBy中不存在 partitionByrelation 列的相应外部值。
  • 整个窗口位于分区之外,或窗口的开头在其结束之后。

如果在与 WINDOW相同的表上定义的计算列中使用 relation,并且省略 orderBy,则返回错误。

如果窗口的开头显示在第一行之前,则会将其设置为第一行。 同样,如果窗口的末尾位于分区的最后一行之后,则会将其设置为最后一行。

reset 只能用于视觉计算,不能与 orderBypartitionBy结合使用。 如果存在 reset,则可以指定 axis,但无法指定 relation

如果值为绝对值 reset (即正整数或 HIGHESTPARENT 字段引用),并且计算在层次结构中目标级别或高于目标级别,则计算将重置每个元素。 也就是说,函数在仅包含该特定元素的分区中求值。

示例 1 - 度量值

以下度量值:

3-day Average Price = 
AVERAGEX(
    WINDOW(
        -2,REL,0,REL,
        SUMMARIZE(ALLSELECTED('Sales'), 'Date'[Date], 'Product'[Product]),
        ORDERBY('Date'[Date]),
        KEEP,
        PARTITIONBY('Product'[Product])
    ), 
    CALCULATE(AVERAGE(Sales[Unit Price]))
)

返回每个产品的单位价格的 3 天平均值。 请注意,3 天时段由产品销售的三天组成,不一定是连续三个日历日。

示例 2 - 度量值

以下度量值:

RunningSum =
SUMX (
    WINDOW (
        1, ABS, 0, REL,
        ALLSELECTED (
            'Date'[Fiscal Year],
            'Date'[Month Number Of Year]
        ),
        PARTITIONBY ( 'Date'[Fiscal Year] )
    ),
    [Total Sales]
)

按年月数返回总销售额的运行总和,并针对每个财政年度重启:

年月数 销售金额 RunningSum
2018 财年 1 1,327,675 美元 1,327,675 美元
2018 财年 2 3,936,463 美元 5,264,138 美元
2018 财年 3 700,873 美元 5,965,011 美元
2018 财年 4 1,519,275 美元 7,484,286 美元
2018 财年 5 2,960,378 美元 10,444,664 美元
2018 财年 6 1,487,671 美元 11,932,336 美元
2018 财年 7 1,423,357 美元 13,355,693 美元
2018 财年 8 2,057,902 美元 15,413,595 美元
2018 财年 9 2,523,948 美元 17,937,543 美元
2018 财年 10 561,681 美元 18,499,224 美元
2018 财年 11 4,764,920 美元 23,264,145 美元
2018 财年 12 596,747 美元 23,860,891 美元
2019 财年 1 1,847,692 美元 1,847,692 美元
2019 财年 2 2,829,362 美元 4,677,054 美元
2019 财年 3 2,092,434 美元 6,769,488 美元
2019 财年 4 2,405,971 美元 9,175,459 美元
2019 财年 5 3,459,444 美元 12,634,903 美元
2019 财年 6 2,850,649 美元 15,485,552 美元
2019 财年 7 2,939,691 美元 18,425,243 美元
2019 财年 8 3,964,801 美元 22,390,045 美元
2019 财年 9 3,287,606 美元 25,677,650 美元
2019 财年 10 2,157,287 美元 27,834,938 美元
2019 财年 11 3,611,092 美元 31,446,030 美元
2019 财年 12 2,624,078 美元 34,070,109 美元
2020 财年 1 3,235,187 美元 3,235,187 美元
2020 财年 2 4,070,046 美元 7,305,233 美元
2020 财年 3 4,429,833 美元 11,735,066 美元
2020 财年 4 4,002,614 美元 15,737,680 美元
2020 财年 5 5,265,797 美元 21,003,477 美元
2020 财年 6 3,465,241 美元 24,468,717 美元
2020 财年 7 3,513,064 美元 27,981,781 美元
2020 财年 8 5,247,165 美元 33,228,947 美元
2020 财年 9 5,104,088 美元 38,333,035 美元
2020 财年 10 3,542,150 美元 41,875,184 美元
2020 财年 11 5,151,897 美元 47,027,081 美元
2020 财年 12 4,851,194 美元 51,878,275 美元

示例 3 - 视觉计算

以下视觉计算 DAX 查询:

TotalSalesRunningSumByYear = SUMX(WINDOW(0, ABS, 0, REL, ROWS, HIGHESTPARENT), [SalesAmount])

按月份返回按月计算的累计总销售额。 可以使用值 1 而不是 HIGHESTPARENT具有相同的结果。

下面的屏幕截图显示了视觉矩阵和视觉计算表达式:

DAX 视觉计算

示例 4 - 视觉计算

以下视觉计算 DAX 查询:

TotalSalesRunningSumByQuarter = SUMX(WINDOW(0, ABS, 0, REL, , -1), [SalesAmount])

按月份返回累计总销售额,按季度计算。 可以使用该值 LOWESTPARENT 而不是 -1,结果相同。

INDEX MOVINGAVERAGE OFFSET ORDERBY PARTITIONBY RANGE RANK ROWNUMBER RUNNINGSUM