DAX 第六篇:统计函数
统计函数用于创建聚合,对数据进行统计分析。在使用统计函数时,必须考虑到数据模型,表之间关系,数据重复等因素,一般都会搭配过滤函数实现数据的提取和分析。
统计量一般是:均值、求和、计数、最大值、最小值、求中位数、求分位数、方差和标准差等。
一,求均值
均值分为几何均值和算术均值,几何平均数是n个变量值连乘积的n次方根:

常用下面两个函数计算列值的算术平均值,AVERAGE函数用于对表中的数值型的列计算均值,并且只能用于基础表,参数的格式是table[decimal_column]:
AVERAGE(<column>)
AVERAGEX(<table>,<expression>)
而AVERAGEX函数功能更为强大,参数table可以是基础表,也可以是返回表值的函数;参数 expression 是关于列的表达式,函数计算表达式的均值:
=AVERAGEX(InternetSales, InternetSales[Freight]+ InternetSales[TaxAmt])
对于几何均值,有下面两个函数来计算:
GEOMEAN(<column>)
GEOMEANX(<table>, <expression>)
二,求和
通过以下两个函数来计算加和,SUM函数只能用于数值型的列,并且只能用于基础表,参数的格式是table[decimal_column]:
SUM(<column>)
SUMX(<table>, <expression>)
SUMX函数从表中计算每一个行的加和,参数table可以是基础表,也可以是返回表值的函数;参数 expression 是关于列的表达式,只有数值会被加和,忽略空值,date,逻辑值或文本值:
示例,第一个参数是过滤器返回的表值,计算[Freight]的加和:
=SUMX(FILTER(InternetSales, InternetSales[SalesTerritoryID]=5),[Freight])
可以把SUMX函数,转换为CALCULATE函数:
=CALCULATE( SUM(InternetSales[Freight]), FILTER(InternetSales, InternetSales[SalesTerritoryID]=5))
三,计数
常用的计数函数有8个,函数的语法如下:
COUNT(<column>)
COUNTA(<column>)
DISTINCTCOUNT(<column>)
DISTINCTCOUNTNOBLANK (<column>)
COUNTBLANK(<column>)
COUNTROWS(<table>)
COUNTX(<table>,<expression>)
COUNTAX(<table>,<expression>)
这8个函数都用于计数,根据函数的名称,大致分为5类:
- 函数名称中的 A 是指适用于Any 数据类型,不带A的函数只能用于数值、日期和字符串,不支持逻辑类型;不统计Blank值;
- 函数名称带后缀X的函数适用于基础表和返回表值的表达式,不带X的函数只能用于基础表;不统计Blank值;
- 统计Blank值
- 统计总行数
- 唯一值计数
下面的6个函数用于基础表,根据列值和列的类型进行计数:
- COUNT :统计列值不为Blank的行的数量,列值的类型可以是:数值、日期和字符串,不支持逻辑类型,Blank值会被忽略。
- COUNTA :统计列值不为Blank的行的数量,列值的类型可以是:数值、日期、字符串和逻辑类型,Blank值会被忽略。
- COUNTBLANK :统计列值是Blank的行的数量,列值的类型可以是任意类型,该函数只统计包含Blank值的行的数量。
- COUNTROWS :统计表的总行数
- DISTINCTCOUNT :统计列值不重复的数量,列值的类型可以是任意类型,包含BLANK,在该函数中BLANK的值是相同的。
- DISTINCTCOUNTNOBLANK :统计列值不为Blank,且不重复的数量,列值的类型可以是任意类型
下面的2个函数用于基础表,或返回表的表达式中:
- COUNTX :统计列值不为Blank的行的数量,列值的类型可以是:数值、日期和字符串,不支持逻辑类型,Blank值会被忽略。
- COUNTAX :统计列值不为Empty(Blank)的行的数量,列值的类型可以是:数值、日期、字符串和逻辑类型,Blank值会被忽略。
注意:在COUNTAX函数中,如果列中包含表达式,而表达式的结果是空值,在这种情况下,COUNTAX函数把包含公式的列值作为非空(nonblank)看待,计数值会增加。如果COUNTAX函数的列中不包含表达式,当列值为Blank时,COUNTAX函数会忽略Blank值,计数值不会增加。
四,求最大值和最小值
通过以下6个函数来计算列值的最大值和最小值,在进行比较时,Blank(或Empty Cell)会被忽略掉。
MAX(<column>)
MAXA(<column>)
MAXX(<table>,<expression>)
MIN(<column>)
MINA(<column>)
MINX(<table>, < expression>)
1,列值比较
根据函数中是否带后缀A,把函数分为两类:
- 带后缀A的统称为最值 - A函数,有MAXA和MINA共2个;
- 不带后缀A的统称为常规最值函数,有MAX、MAXX、MIN和MINX 共4个。
这两类函数在功能上有微小的区别:
- 常规最值函数:不支持逻辑值的比较,但是支持数值、日期和文本的比较,忽略Blank;如果所有的列值都是Blank/Empty,导致列中没有可用的值,那么常规最值函数最终返回Blank。
- 最值 - A函数:不支持文本的比较,但是支持数值、日期和逻辑值的比较,忽略Blank;如果所有的列值都是Blank/Empty,导致列中没有可用的值,那么最值 - A函数最终返回0。
注意:在比较逻辑值时,TRUE被视为1,FALSE被视为0。
2,比较两个值
在比较两个值时,如果参数为Blank,那么Blank被视为0:
MIN(<expression1>, <expression2>)
MAX(<expression1>, <expression2>)
五,中位数
中位数和分位数都是针对数值型进行统计的,Blank、日期、逻辑值和文本会被忽略。
MEDIAN(<column>)
MEDIANX(<table>, <expression>)
六,分位数
k表示期望的百分位值,其中INC是指inclusive(包含),EXC是指exclusive(不包含)。后缀带EXC的函数,参数k的取值范围是0-1,不包含0和1;后缀带INC的函数,参数k的取值范围是0-1,包含0和1。
PERCENTILE.EXC(<column>, <k>)
PERCENTILE.INC(<column>, <k>)
PERCENTILEX.EXC(<table>, <expression>, k)
PERCENTILEX.INC(<table>, <expression>, k)
当指定百分位数的值介于数组中的两个值之间时,这4个函数都会进行插值。 如果无法插入指定的k百分位数,则返回错误。
- 对于 INC函数,如果k不是1 /(n - 1)的倍数,则这4个函数将进行插值以确定第k个百分位数的值。
- 对于 EXC函数,如果k不是1 /(n + 1)的倍数,则这4个函数将进行插值以确定第k个百分位数的值。
PERCENTILE.INC
计算原理是:对于数组中的每个值,都会按照从小到大的顺序给定一个百分位(基于n-1),假如数组有n个数值,这n个百分位分别是:0/(n-1)、1/(n-1)、2/(n-1)……n-1/(n-1),当k值与这些百分位相同时,即k是1/(n-1)的倍数,直接返回数组中对应的数值,如果k不是 1/(n-1) 的倍数,则 PERCENTILE.INC 使用插值法来确定第k个百分点的值。
PERCENTILE.EXC
计算原理是:对于数组中的每个值,都会按照从小到大的顺序给定一个百分位(基于n+1),假如数组有n个数值,这n个百分位分别是:1/(n+1)、2/(n+1)、3/(n+1)……n/(n+1),当k值与这些百分位相同时,即k是1/(n+1)的倍数,直接返回数组中对应的数值,如果k不是 1/(n+1) 的倍数,则 PERCENTILE.EXC 使用插值法来确定第k个百分点的值。
引用简书上《 分位数计算,分析Excel中函数实现原理》的一个例子,作者是过桥0811 :


Python代码实现:
import math
def percentile_inc(array,k):
if len(array) == 0:
return "数组不能为空"
if k > 1 or k < 0:
return "系数需为 0 到 1 之间的百分点值,包含 0 和 1"
array_sort = sorted(array)
address = (len(array_sort) - 1) * k + 1
if address == len(array_sort):
return array_sort[len(array_sort) - 1]
i = int(math.modf(address)[1]) #取出整数部分
j = math.modf(address)[0] #取出小数部分
value = array_sort[i-1] + (array_sort[i] - array_sort[i-1]) * j
#print("数组为:" + str(array), "系数为:" + str(k),"百分位数为:" + str(value))
return value
def percentile_exc(array,k):
if len(array) == 0:
return "数组不能为空"
if k >= 1 or k <= 0:
return "系数需为 0 到 1 之间的百分点值,不包含 0 和 1 "
array_sort = sorted(array)
address = (len(array_sort) + 1) * k
if address < 1:
return "因系数过小,不能通过插入值来确定指定的百分点的值"
i = int(math.modf(address)[1]) #取出整数部分
j = math.modf(address)[0] #取出小数部分
value = array_sort[i-1] + (array_sort[i] - array_sort[i-1]) * j
#print("数组为:" + str(array), "系数为:" + str(k),"百分位数为:" + str(value))
return value
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],0))
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],0.01))
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],0.25))
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],1))
print(percentile_inc([1,3,2,4],0.3)) # 官网测试数据
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0))
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0.01))
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0.09))
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0.25))
print(percentile_exc([1,2,3,6,6,6,7,8,9],0.25)) # 官网测试数据
七,求方差和标准方差
标准差是方差的算术平方根,反映一个数据集的离散程度。DAX通过以下8个函数计算方差和标准方差,这些函数只适用于数值型列,并且会忽略Blank值:
VAR.S(<columnName>)
VAR.P(<columnName>)
VARX.S(<table>, <expression>)
VARX.P(<table>, <expression>)STDEV.S(<ColumnName>)
STDEV.P(<ColumnName>)
STDEVX.S(<table>, <expression>)
STDEVX.P(<table>, <expression>)
根据函数后缀的不同,可以把函数分为两类:后缀为P表示返回整个总体的方差或标准差,后缀为S表示返回样本总体的方差或标准差。
对于方差来说,整个总体和样本总体的计算公式是不同的:
- 整个总体的方差计算公式是:∑(x - x̃)²/n
- 样本总体的方差计算公式是:∑(x - x̃)²/(n-1)
注释: x̃ 是 数据的均值,n是数据的数量
参考文档:
DAX 第六篇:统计函数的更多相关文章
- 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)
解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...
- 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions (译) http://improve.dk/avoiding-regressions-in-orcamdf-b ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- RabbitMQ学习总结 第六篇:Topic类型的exchange
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 第六篇 Replication:合并复制-发布
本篇文章是SQL Server Replication系列的第六篇,详细内容请参考原文. 合并复制,类似于事务复制,包括一个发布服务器,一个分发服务器和一个或多个订阅服务器.每一个发布服务器上可以定义 ...
- 第六篇 Integration Services:初级工作流管理
本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...
- 第六篇 SQL Server安全执行上下文和代码签名
本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却 ...
- 第六篇 SQL Server代理深入作业步骤工作流
本篇文章是SQL Server代理系列的第六篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.每个作业步骤在技术 ...
随机推荐
- 基于QT的在线打字练习软件助手(C/S模型)good
简介 通过基于QT中QTcpServer和QTcpSocket以及UI编程,实现了基于TCP协议的C/S模型在线打字练习软件助手,服务端处理各客户端打字数据,以及显示在线打字客户列表即实时更新打字 ...
- [转]UE的职责
最近开始负责产品工作,从产品定位到需求文档再到原型设计,以及后续产品的路线规划,渐渐感觉忙不过来了.所以准备招一个UE/X来辅助. 以前做项目,也没接触过什么UE,所以对UE的工作不是很清楚,尤其是P ...
- QT父子窗口事件传递与事件过滤器(讲了一些原理,比较清楚)
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...
- 递归导致的StackOverflow的分析
递归在多层次遍历时尤为重要,这里我们不讲递归的实现,来谈谈递归的内存占用情况. 如下代码,当我们运行时很简单,StackOverflowException瞬间抛出:这里确实是“瞬间”出错了,线程堆栈溢 ...
- kafka笔记6
我们讨论可靠性时,一般使用保证这个词,它是确保系统在各种不同的环境下能够发生一致的行为.Kafka可以在哪些方面作出保证呢? 1.Kafka可以保证分区消息的顺序 2.只有消息被写入分区的所有同步副本 ...
- HTML连载9-video标签的第二种格式&audio标签
一.video第二种格式 1.背景:由于视频数据非常重要,所以五大浏览器厂商都不愿意支持别人的视频格式,所以导致了没有一种视频格式是所有浏览器都支持的.这个时候W3C为了解决这个问题,所以推出了第二种 ...
- 基于 Roslyn 实现动态编译
基于 Roslyn 实现动态编译 Intro 之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句,原来是基于 CodeDom 实现的,最近改成使用基于 Roslyn ...
- SpringBoot启动访问JSP页面,直接进入页面或者访问不到,报404,并且加载tomcat插件tomcat-embed-jasper也不行
这个问题花费了两天的时间,解决路径: 我用的是SpringBoot1.5.2,SpringMVC和Spring,tomcat启动插件都是默认的版本,Spring是4.3.7,jdk是1.7.0_80, ...
- 拉格朗日乘子法 - KKT条件 - 对偶问题
接下来准备写支持向量机,然而支持向量机和其他算法相比牵涉较多的数学知识,其中首当其冲的就是标题中的拉格朗日乘子法.KKT条件和对偶问题,所以本篇先作个铺垫. 大部分机器学习算法最后都可归结为最优化问题 ...
- node实现文件拷贝2
https://www.cnblogs.com/coding4/p/7495968.html 文件拷贝NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件 ...