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 表达式都必须是完全限定的列名,并且来自单个表。
- 默认为 orderBypartitionBy中的所有列的 ALLSELECTED()。
axis (可选)视觉形状中的轴。 仅在视觉计算中可用,并替换 relation
orderBy (可选)包含定义每个分区排序方式的表达式的 ORDERBY() 子句。
如果省略:必须显式指定
- relation
- 默认为 relation 中尚未在 partitionBy中指定的每一列排序。
blanks (可选)一个枚举,用于定义在对 relationaxis进行排序时如何处理空值。
支持的值为:
  • DEFAULT(默认值),其中数值的行为为空值,在零值和负值之间排序。 字符串的行为是空值在所有字符串(包括空字符串)之前排序。
  • FIRST,无论升序或降序排序顺序如何,空白始终在开头排序。
  • LAST,无论升序还是降序排序顺序,始终在末尾对空白进行排序。

注意,如果同时指定 ORDERBY() 函数中的 blanks 参数和空值,则单个 orderBy 表达式上的 blanks 优先于相关 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 最终输出是这些行的联合。
  • 如果有多个相应的外部列,则返回错误。

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

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

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

如果:

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

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

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

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

示例 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]
)

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

年月数 Sales Amount 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 和 -2 可以使用,而不是 HIGHESTPARENT,结果相同。

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

DAX 视觉计算

示例 4 - 视觉计算

以下视觉计算 DAX 查询:

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

按月份返回累计总销售额,按季度计算。

INDEX MOVINGAVERAGE OFFSET ORDERBY PARTITIONBY RANGE RANK ROWNUMBER RUNNINGSUM