一、Window函数
语法:
Window ( <起始位置>,<起始位置类型>,<结束位置>,<结束位置类型>, [<关系>], [<OrderBy>],[空白],[PartitionBy] )
含义:
对指定分区(PartitioinBy)中的行(关系表),按指定的列进行排序(OrderBy)后,根据(起始位置)和(结束位置)定位多行。
参数:
参数 | 属性 | 描述 |
起始位置 | ABS时,1代表第1行,-1代表最后1行;REL时,-1代表上一行,0代表当前行,1代表下一行 | |
起始位置类型 | 可选 | ABS(绝对)和 REL(相对),默认为 REL |
结束位置 | ABS时,1代表第1行,-1代表最后1行;REL时,-1代表上一行,0代表当前行,1代表下一行 | |
结束位置类型 | 可选 | ABS(绝对)和 REL(相对),默认为 REL |
关系表 | 可选 | 表表达式,要包含第3、第5个参数中用的列 |
OrderBy | 可选 | 排序依据,如省略,第二个参数须指定 |
空白 | 可选 | 保留的参数位置,暂时无用 |
PartitionBy | 可选 | 分区依据如果省略,视同只有一个分区 |
备注:
OrderBy、PartitionBy中出现的列,需要先在“关系表”中引用。
二、实例
已知表:日期表和表:销售记录(2020年~2022年),
表:日期表
表:销售记录(2020年~2022年)
生成月度销售金额报表
1、新建度量值,销售金额 = SUM('销售记录'[金额])
2、新建度量值,window(-1REL,1REL) = CALCULATE('度量值表'[销售金额],WINDOW(-1,REL,1,REL,ALLSELECTED('日期表'[年],'日期表'[月]),ORDERBY('日期表'[月],ASC),,PARTITIONBY('日期表'[年])))
解析:以‘日期表’[年]作为分区,按‘日期表’[月]进行升序排列,然后定位当前行上一行至当前行下一行(-1,REL,1,REL)
3、新建度量值,window(1ABS,-1ABS) = CALCULATE('度量值表'[销售金额],WINDOW(1,ABS,-1,ABS,ALLSELECTED('日期表'[年],'日期表'[月]),ORDERBY('日期表'[月],ASC),,PARTITIONBY('日期表'[年])))
解析:以‘日期表’[年]作为分区,按‘日期表’[月]进行升序排列,然后定位第一行至最后一行(1,ABS,-1,ABS)
4、新建度量值,window(0REL,-1ABS) = CALCULATE('度量值表'[销售金额],WINDOW(0,REL,-1,ABS,ALLSELECTED('日期表'[年],'日期表'[月]),ORDERBY('日期表'[月],ASC),,PARTITIONBY('日期表'[年])))
解析:以‘日期表’[年]作为分区,按‘日期表’[月]进行升序排列,然后定位当前行至最后一行(0,REL,-1,ABS)
5、新建度量值,window(1ABS,0REL) = CALCULATE('度量值表'[销售金额],WINDOW(1,ABS,0,REL,ALLSELECTED('日期表'[年],'日期表'[月]),ORDERBY('日期表'[月],ASC),,PARTITIONBY('日期表'[年])))
解析:以‘日期表’[年]作为分区,按‘日期表’[月]进行升序排列,然后定位第一行至当前行(1,ABS,0,REL)