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 开始。 例如,1 表示窗口从分区开头开始。 如果 <from> 为负数,则表示从分区结束的窗口的起始位置。 -1 表示分区中的最后一行。 |
from_type | 修改 <from> 参数的行为。 可能的值为 ABS(绝对)和 REL(相对)。 默认为 REL。 |
to | 与 <from> 相同,但表示窗口的末尾。 最后一行包含在窗口中。 |
to_type | 与 <from_type> 相同,但修改 <to> 的行为。 |
relation | (可选)从中返回输出行的表表达式。 如果指定,<partitionBy> 中的所有列都必须来自它或相关表。 如果省略: - 必须显式指定 <orderBy>。 - 所有 <orderBy> 和 <partitionBy> 表达式必须是完全限定的列名称,并且来自单个表。 - <orderBy> 和 <partitionBy> 中的所有列都默认为 ALLSELECTED()。 |
轴 | (可选)视觉形状中的轴。 仅在视觉计算中可用,并替换 <relation>。 |
orderBy | (可选)包含用于定义每个分区排序方式的表达式的 ORDERBY() 子句。 如果省略: - 必须显式指定 <relation>。 - 默认为按 <relation> 中尚未在 <partitionBy> 中指定的每个列排序。 |
空白 | (可选)定义排序时如何处理空白值的枚举。 此参数留待将来使用。 目前,唯一支持的值为 DEFAULT,其中数值的行为是空白值在零和负值之间排序。 字符串的行为是空白值排列在所有字符串(包括空字符串)之前。 |
partitionBy | (可选)包含用于定义 <relation> 分区方式的列的 PARTITIONBY() 子句。 如果省略,则 <relation> 会被视为单个分区。 |
matchBy | (可选)包含用于定义如何匹配数据和标识当前行的列的 MATCHBY() 子句。 |
reset | (可选)仅在视觉计算中可用。 指示计算是否重置,以及处于视觉形状的列层次结构的哪个级别。 接受的值为:NONE、LOWESTPARENT、HIGHESTPARENT 或整数。 此行为取决于整数符号: - 如果为零或省略,则计算不会重置。 等效于 NONE。 - 如果为正值,则整数标识从最高开始的列、与粒度无关。 HIGHESTPARENT 等效于 1。 - 如果为负值,则整数标识相对于当前粒度从最低开始的列。 LOWESTPARENT 等效于 -1。 |
返回值
窗口中的所有行。
注解
除 DAX 表函数添加的列外,<relation> 中的各列(不存在 <matchBy> 时),或 <matchBy> 和 <partitionBy> 中的各列(存在 <matchBy> 时)都必须具有相应的外部值,以帮助定义要操作的当前行。 如果 <from_type> 和 <to_type> 都具有值 ABS,则以下内容仅适用于 <partitionBy> 列:
- 如果正好有一个对应的外部列,则使用其值。
- 如果没有对应的外部列:
- WINDOW 将首先确定没有对应外部列的所有列。
- 对于 WINDOW 父上下文中这些列的现有值的每个组合,将计算 WINDOW,并返回相应的行。
- WINDOW 的最终输出是这些行的并集。
- 如果有多个对应的外部列,则会返回错误。
如果 DAX 表函数添加了 <relation> 的所有列,则返回错误。
如果存在 <matchBy>,WINDOW 将尝试使用 <matchBy> 和 <partitionBy> 列来标识行。
如果不存在 <matchBy>,<orderBy> 和 <partitionBy> 中指定的列无法唯一地标识 <relation> 中的每一行,则:
- WINDOW 将尝试查找唯一地标识每行所需的最少数量的附加列。
- 如果可以找到这种列,WINDOW 会自动将这些新列追加到 <orderBy>,并且每个分区都使用这组新的 orderBy 列进行排序。
- 如果找不到这种列,则返回错误。
在以下情况下,将返回一个空表:
- <orderBy> 或 <partitionBy> 列的相应外部值不存在于 <relation> 中。
- 整个窗口位于分区之外,或者窗口开头位于其结束之后。
如果在与 <relation> 相同的表上定义的计算列中使用 WINDOW,并且省略了 <orderBy>,则会返回错误。
如果窗口开头在第一行之前,那么它就被设置为第一行。 同样,如果窗口末尾位于分区最后一行之后,它就被设置为最后一行。
<reset> 只能用于视觉计算,不能与 <orderBy> 或 <partitionBy> 结合使用。 如果存在 <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]
)
按当年具体月份返回总销量的运行总和,并针对每个财年重启:
Year | 当年具体月份 | 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,结果相同。
下面的屏幕截图显示了视觉矩阵和视觉计算表达式:
示例 4 - 视觉计算
以下视觉计算 DAX 查询:
TotalSalesRunningSumByQuarter = SUMX(WINDOW(0, ABS, 0, REL, , -1), [SalesAmount])
返回每个季度按月计算的累计总销售额。
相关内容
INDEX
MOVINGAVERAGE
OFFSET
ORDERBY
PARTITIONBY
RANGE
RANK
ROWNUMBERRUNNINGSUM