ROW_NUMBER
描述
ROW_NUMBER
是一个窗口聚合函数,用于对行进行分组,按字段对行进行排序,并为组中的每一行指定一个唯一的连续编号。对于组中的第一行,从 1 开始 . ROW_NUMBER
始终为组中的每一行指定唯一的值。您可能需要使用 ROW_NUMBER
为数据集中的每一行创建唯一编号。该
PARTITION BY
子句确定使用哪些字段对一组输入行进行分组。该
ORDER BY
子句决定了在为分区中的行指定序号之前,如何对其进行排序。Workday 会根据分区字段将输入行分组,根据排序字段对行进行排序,然后计算每个组中的聚合表达式(此函数的行编号)。每组中的编号行从 1 开始。
语法
ROW_NUMBER()OVER(PARTITION BYpartitioning_field[,partitioning_field]ORDER BYordering_field[ASC | DESC] [,ordering_field[ASC | DESC]] )
返回值
返回类型为
INTEGER
。输入参数
- OVER()
- 必填。OVER必须在 内使用ROW_NUMBER表达式。
- PARTITION BY分区字段
- 必修内容。使用PARTITION BY子句,可指定一个或多个字段,用于对一组输入行进行分区。您可以指定除币种以外的任何字段类型。示例:您将“月”字段指定为分区字段,以便 Workday 将具有相同“月”值的所有记录分组到一个分区中。
- ORDER BYordering_field
- 必修内容。使用ORDER BY子句,以指定如何使用每个分区内指定字段中的值对分区中的输入行进行排序。您可以指定除币种以外的任何字段类型。您可以使用DESC或ASC关键字,为每个排序字段按降序(从高到低的值,空值在最后)或升序(从低到高的值,空值在前)排序。如果您没有为排序字段指定排序顺序,Workday 会自动按升序对行进行排序。
示例
示例:您的数据集包含以下行和字段。
员工 | 销售日期 | Sales |
|---|---|---|
Goh | 12/31/2018 | 140 |
Goh | 11/30/2018 | 60 |
Goh | 10/31/2018 | 140 |
费里曼 | 12/31/2018 | 160 |
费里曼 | 11/30/2018 | 60 |
费里曼 | 10/31/2018 | 110 |
Smith | 12/31/2018 | 140 |
Smith | 11/30/2018 | 60 |
Smith | 10/31/2018 | 120 |
您可以为每个员工的销售额指定一个唯一的编号(按降序排列),将最高销售额的员工指定为排名 1。在
“销售数字(按员工)”
字段中使用以下表达式:ROW_NUMBER() OVER( PARTITION BY [Employee] ORDER BY [Sales] DESC)
您将得到以下结果:
员工 | 销售日期 | Sales | 销售数字(按员工) |
|---|---|---|---|
Goh | 12/31/2018 | 140 | 1 |
Goh | 10/31/2018 | 140 | 2 |
Goh | 11/30/2018 | 60 | 3 |
费里曼 | 12/31/2018 | 160 | 1 |
费里曼 | 10/31/2018 | 110 | 2 |
费里曼 | 11/30/2018 | 60 | 3 |
Smith | 12/31/2018 | 140 | 1 |
Smith | 10/31/2018 | 120 | 2 |
Smith | 11/30/2018 | 60 | 3 |
您还可以按降序为每个日期的销售额指定唯一的编号,将销售额最高的销售额指定为排名 1。在
“销售额(按日期)”
字段中使用以下表达式:ROW_NUMBER() OVER( PARTITION BY [Sales Date] ORDER BY [Sales] DESC)
您将得到以下结果:
员工 | 销售日期 | Sales | 销售额(按日期) |
|---|---|---|---|
费里曼 | 12/31/2018 | 160 | 1 |
Goh | 12/31/2018 | 140 | 2 |
Smith | 12/31/2018 | 140 | 3 |
Goh | 11/30/2018 | 60 | 1 |
费里曼 | 11/30/2018 | 60 | 2 |
Smith | 11/30/2018 | 60 | 3 |
Goh | 10/31/2018 | 140 | 1 |
Smith | 10/31/2018 | 120 | 2 |
费里曼 | 10/31/2018 | 110 | 3 |
您还可以使用
ROW_NUMBER
针对每个编号包含多行的数据集中,确定每一行的最新版本。在这种情况下,数据集需要一个日期字段,用于表示该行中的信息生效的时间。如果您熟悉数据仓库的概念,就会知道这是一个类型 2 缓慢变化的维度表。您的数据集包含以下行和字段。编号 | 名称 | 区域 | 生效日期 |
|---|---|---|---|
G1 | 高曼 | West | 01/01/2015 |
H1 | Harris | West | 01/01/2015 |
G1 | 高曼 | East | 09/01/2016 |
H1 | Harris | East | 01/03/2017 |
H1 | Harris | 居民身份证件 | 01/20/2021 |
要将值 1 指定给每个编号的最新版本,请在
“最新版本”
字段中使用以下表达式:ROW_NUMBER() OVER( PARTITION BY [ID] ORDER BY [Effective Date] DESC)
您将得到以下结果:
编号 | 名称 | 区域 | 生效日期 | 最新版本 |
|---|---|---|---|---|
G1 | 高曼 | West | 01/01/2015 | 2 |
H1 | Harris | West | 01/01/2015 | 3 |
G1 | 高曼 | East | 09/01/2016 | 1 |
H1 | Harris | East | 01/03/2017 | 2 |
H1 | Harris | 居民身份证件 | 01/20/2021 | 1 |
您可以使用“筛选器阶段”按
“最新版本”
进行筛选,以便仅为每个编号仅返回最新的行。